(python)如何在tkinter环境中将函数转换为模块
我尝试将功能转换为TKINTER中的模块。但是,它失败了。
原始版本:在主代码中嵌入函数(sl_adder)
,我使用.get()
函数
from tkinter import *
import tkinter.ttk as ttk
def sl_adder():
aa = float(xxx.get())
bb = float(yyy.get())
cc = aa + bb
mylabel = ttk.Label(root, text = cc).grid(column=1, row=4, padx=10, pady=15, sticky=N)
root = Tk()
root.title('Denny')
root.geometry("800x900")
xxx = StringVar()
yyy = StringVar()
ttk.Label(root,text = "Adding System", font=('Arial', 25)).grid(column=0, row=0, ipadx=5, pady=5, sticky=W+N)
ttk.Label(root,text = "Input Two Numbers", font=('Arial', 10)).grid(column=0, row=1, ipadx=5, pady=20, sticky=W+N)
ttk.Label(root,text = "1st number: ", font=('Arial', 10)).grid(column=0, row=2, ipadx=5, pady=15, sticky=W+N)
ttk.Label(root,text = "2nd number: ", font=('Arial', 10)).grid(column=0, row=3, ipadx=5, pady=15, sticky=W+N)
ttk.Entry(root, textvariable=xxx, width=20).grid(column=1, row=2, padx=10, pady=15, sticky=N)
ttk.Entry(root, textvariable=yyy, width=20).grid(column=1, row=3, padx=10, pady=15, sticky=N)
resultButton = ttk.Button(root, text = 'Calculate', command = sl_adder)
resultButton.grid(column=3, row=2, pady=15, sticky=W)
close_window = ttk.Button(root, text="Destroy", command = root.destroy)
close_window.grid(column=3, row=3, pady=15, sticky=W)
第二版:将函数转换为模块(sl_adder)
from tkinter import *
import tkinter.ttk as ttk
from sl_adder import sl_adder # <-------------------------
root = Tk()
root.title('Denny')
root.geometry("800x900")
xxx = StringVar()
yyy = StringVar()
ttk.Label(root,text = "Adding System", font=('Arial', 25)).grid(column=0, row=0, ipadx=5, pady=5, sticky=W+N)
ttk.Label(root,text = "Input Two Numbers", font=('Arial', 10)).grid(column=0, row=1, ipadx=5, pady=20, sticky=W+N)
ttk.Label(root,text = "1st number: ", font=('Arial', 10)).grid(column=0, row=2, ipadx=5, pady=15, sticky=W+N)
ttk.Label(root,text = "2nd number: ", font=('Arial', 10)).grid(column=0, row=3, ipadx=5, pady=15, sticky=W+N)
ttk.Entry(root, textvariable=xxx, width=20).grid(column=1, row=2, padx=10, pady=15, sticky=N)
ttk.Entry(root, textvariable=yyy, width=20).grid(column=1, row=3, padx=10, pady=15, sticky=N)
resultButton = ttk.Button(root, text = 'Calculate', command = sl_adder)
resultButton.grid(column=3, row=2, pady=15, sticky=W)
close_window = ttk.Button(root, text="Destroy", command = root.destroy)
close_window.grid(column=3, row=3, pady=15, sticky=W)
模块sl_adder
:
def sl_adder():
aa = float(xxx.get())
bb = float(yyy.get())
cc = aa + bb
mylabel = ttk.Label(root, text = cc).grid(column=1, row=4, padx=10, pady=15, sticky=N)
当我运行它时,它显示了:
NameError: name 'xxx' is not defined
如何修复它?我仅删除功能并产生一个模块。
=============================================== ==========
现在我将其修复为以后的
from tkinter import *
import tkinter.ttk as ttk
from sl_adder import sl_adder
root = Tk()
root.title('Denny')
root.geometry("800x900")
xxx = StringVar()
yyy = StringVar()
ttk.Label(root,text = "Adding System", font=('Arial', 25)).grid(column=0, row=0, ipadx=5, pady=5, sticky=W+N)
ttk.Label(root,text = "Input Two Numbers", font=('Arial', 10)).grid(column=0, row=1, ipadx=5, pady=20, sticky=W+N)
ttk.Label(root,text = "1st number: ", font=('Arial', 10)).grid(column=0, row=2, ipadx=5, pady=15, sticky=W+N)
ttk.Label(root,text = "2nd number: ", font=('Arial', 10)).grid(column=0, row=3, ipadx=5, pady=15, sticky=W+N)
ttk.Entry(root, textvariable=xxx, width=20).grid(column=1, row=2, padx=10, pady=15, sticky=N)
ttk.Entry(root, textvariable=yyy, width=20).grid(column=1, row=3, padx=10, pady=15, sticky=N)
aa = float(xxx.get()) # <=====================
bb = float(yyy.get()) # <=====================
resultButton = ttk.Button(root, text = 'Calculate', command = sl_adder(aa,bb))
resultButton.grid(column=3, row=2, pady=15, sticky=W)
close_window = ttk.Button(root, text="Destroy", command = root.destroy)
close_window.grid(column=3, row=3, pady=15, sticky=W)
root.mainloop()
模块
def sl_adder(aa,bb):
cc = aa + bb
mylabel = ttk.Label(root, text = cc).grid(column=1, row=4, padx=10, pady=15, sticky=N)
,但是,另一个错误弹出了
aa = float(xxx.get())
ValueError: could not convert string to float: ''
如何修复它?
I tried to convert a function to a module in tkinter; however, it failed.
Original version: embed a function (sl_adder) in main codes
Here I use .get()
function
from tkinter import *
import tkinter.ttk as ttk
def sl_adder():
aa = float(xxx.get())
bb = float(yyy.get())
cc = aa + bb
mylabel = ttk.Label(root, text = cc).grid(column=1, row=4, padx=10, pady=15, sticky=N)
root = Tk()
root.title('Denny')
root.geometry("800x900")
xxx = StringVar()
yyy = StringVar()
ttk.Label(root,text = "Adding System", font=('Arial', 25)).grid(column=0, row=0, ipadx=5, pady=5, sticky=W+N)
ttk.Label(root,text = "Input Two Numbers", font=('Arial', 10)).grid(column=0, row=1, ipadx=5, pady=20, sticky=W+N)
ttk.Label(root,text = "1st number: ", font=('Arial', 10)).grid(column=0, row=2, ipadx=5, pady=15, sticky=W+N)
ttk.Label(root,text = "2nd number: ", font=('Arial', 10)).grid(column=0, row=3, ipadx=5, pady=15, sticky=W+N)
ttk.Entry(root, textvariable=xxx, width=20).grid(column=1, row=2, padx=10, pady=15, sticky=N)
ttk.Entry(root, textvariable=yyy, width=20).grid(column=1, row=3, padx=10, pady=15, sticky=N)
resultButton = ttk.Button(root, text = 'Calculate', command = sl_adder)
resultButton.grid(column=3, row=2, pady=15, sticky=W)
close_window = ttk.Button(root, text="Destroy", command = root.destroy)
close_window.grid(column=3, row=3, pady=15, sticky=W)
Second version: convert a function to a module (sl_adder)
from tkinter import *
import tkinter.ttk as ttk
from sl_adder import sl_adder # <-------------------------
root = Tk()
root.title('Denny')
root.geometry("800x900")
xxx = StringVar()
yyy = StringVar()
ttk.Label(root,text = "Adding System", font=('Arial', 25)).grid(column=0, row=0, ipadx=5, pady=5, sticky=W+N)
ttk.Label(root,text = "Input Two Numbers", font=('Arial', 10)).grid(column=0, row=1, ipadx=5, pady=20, sticky=W+N)
ttk.Label(root,text = "1st number: ", font=('Arial', 10)).grid(column=0, row=2, ipadx=5, pady=15, sticky=W+N)
ttk.Label(root,text = "2nd number: ", font=('Arial', 10)).grid(column=0, row=3, ipadx=5, pady=15, sticky=W+N)
ttk.Entry(root, textvariable=xxx, width=20).grid(column=1, row=2, padx=10, pady=15, sticky=N)
ttk.Entry(root, textvariable=yyy, width=20).grid(column=1, row=3, padx=10, pady=15, sticky=N)
resultButton = ttk.Button(root, text = 'Calculate', command = sl_adder)
resultButton.grid(column=3, row=2, pady=15, sticky=W)
close_window = ttk.Button(root, text="Destroy", command = root.destroy)
close_window.grid(column=3, row=3, pady=15, sticky=W)
Module sl_adder
:
def sl_adder():
aa = float(xxx.get())
bb = float(yyy.get())
cc = aa + bb
mylabel = ttk.Label(root, text = cc).grid(column=1, row=4, padx=10, pady=15, sticky=N)
When I ran it, it shows:
NameError: name 'xxx' is not defined
How to fix it? I only remove the function and produce a module.
============================================================
Now I fix that as following
from tkinter import *
import tkinter.ttk as ttk
from sl_adder import sl_adder
root = Tk()
root.title('Denny')
root.geometry("800x900")
xxx = StringVar()
yyy = StringVar()
ttk.Label(root,text = "Adding System", font=('Arial', 25)).grid(column=0, row=0, ipadx=5, pady=5, sticky=W+N)
ttk.Label(root,text = "Input Two Numbers", font=('Arial', 10)).grid(column=0, row=1, ipadx=5, pady=20, sticky=W+N)
ttk.Label(root,text = "1st number: ", font=('Arial', 10)).grid(column=0, row=2, ipadx=5, pady=15, sticky=W+N)
ttk.Label(root,text = "2nd number: ", font=('Arial', 10)).grid(column=0, row=3, ipadx=5, pady=15, sticky=W+N)
ttk.Entry(root, textvariable=xxx, width=20).grid(column=1, row=2, padx=10, pady=15, sticky=N)
ttk.Entry(root, textvariable=yyy, width=20).grid(column=1, row=3, padx=10, pady=15, sticky=N)
aa = float(xxx.get()) # <=====================
bb = float(yyy.get()) # <=====================
resultButton = ttk.Button(root, text = 'Calculate', command = sl_adder(aa,bb))
resultButton.grid(column=3, row=2, pady=15, sticky=W)
close_window = ttk.Button(root, text="Destroy", command = root.destroy)
close_window.grid(column=3, row=3, pady=15, sticky=W)
root.mainloop()
With module
def sl_adder(aa,bb):
cc = aa + bb
mylabel = ttk.Label(root, text = cc).grid(column=1, row=4, padx=10, pady=15, sticky=N)
However, another error pops out
aa = float(xxx.get())
ValueError: could not convert string to float: ''
How to fix it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
由于主应用程序和模块在不同的工作区中,因此您无法直接在模块内的主应用程序中访问全局变量。但是,您可以通过函数参数传递它们。
同样,最好在主应用程序而不是内部模块函数中创建结果标签。主应用程序可以从模块函数中获取结果并更新结果文本。
主应用程序:
模块
sl_adder
:Since main application and module are in different workspaces, you cannot access global variables in main application directly inside module. However you can pass them via function arguments.
Also it is better to create the result label in main application instead of inside module function. Main application can get the result from the module function and update the result text.
Main application:
module
sl_adder
: