(python)如何在tkinter环境中将函数转换为模块

发布于 2025-02-06 07:16:31 字数 4657 浏览 1 评论 0原文

我尝试将功能转换为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?

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风吹雪碎 2025-02-13 07:16:31

由于主应用程序和模块在不同的工作区中,因此您无法直接在模块内的主应用程序中访问全局变量。但是,您可以通过函数参数传递它们。

同样,最好在主应用程序而不是内部模块函数中创建结果标签。主应用程序可以从模块函数中获取结果并更新结果文本。

主应用程序:

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',
                          # update result label with the returned result
                          command = lambda: mylabel.config(text=sl_adder(xxx.get(), yyy.get())))
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)

# create the label for showing the result
mylabel = ttk.Label(root)
mylabel.grid(column=1, row=4, padx=10, pady=15, sticky=N)

root.mainloop()

模块sl_adder

def sl_adder(aa, bb):
    # return the result to caller
    return float(aa) + float(bb)

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:

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',
                          # update result label with the returned result
                          command = lambda: mylabel.config(text=sl_adder(xxx.get(), yyy.get())))
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)

# create the label for showing the result
mylabel = ttk.Label(root)
mylabel.grid(column=1, row=4, padx=10, pady=15, sticky=N)

root.mainloop()

module sl_adder:

def sl_adder(aa, bb):
    # return the result to caller
    return float(aa) + float(bb)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文