我对编程还比较陌生,我注意到随着代码的增长,将所有内容编码为2个文件(设置和main)变得非常混乱。 但是,当我将代码拆分为多个文件时,遇到了无法导入fileB.py intro FileA.py并无法在文件B中使用文件A中的变量或小部件的问题(我得到未定义的名称错误)。
我将tkinter用于UI,所以我的主文件是tk循环(main.py)。每个按钮表示不同文件中的功能。在我的功能包括按钮状态或输入文本之前,它一直很好。
此示例与tkinter一起使用,但由于我相信我的代码结构,因此在很多情况下都会遇到此问题。
import FileB
import tkinter
from tkinter import Checkbutton, Tk, Entry, BooleanVar
root = Tk() # initialize blank window
root.geometry("500x500")
# text entry
E1 = Entry(root, bd=5, width = 8)
E1.grid(row=0, column=1)
# Checkbox
CB_var = BooleanVar()
CB = Checkbutton(root, text="Get text", variable=CB_var, command=FileB.get_text() )
CB.grid(row=0, column=2)
root.mainloop()
def get_text():
if CB.var == True:
entry_text = E1.get()
E1.config(state=DISABLED)
print(entry_text)
E1.delete(0, END)
elif CB.var == False:
E1.config(state=NORMAL)
print("Checkbox not selected")
由于E1是在调用函数之前定义的,所以我希望函数能够更改E1的状态,获取其文本并清空该文本;就像函数在我的main.py中一样。
由于E1不是我的FileB中的变量,所以实际输出是未定义的名称错误。
答案 0 :(得分:0)
由于FileB
由main.py
导入,FileB
无法访问main.py
中的对象。您需要通过函数参数在main.py
中传递对象。
建议将小部件放入类中,并将该类的实例传递给FileB.get_text()
函数。
文件A(main.py)
from tkinter import Checkbutton, Tk, Entry, BooleanVar
import FileB
class GUI:
def __init__(self, root=None):
# text entry
self.E1 = Entry(root, bd=5, width = 8)
self.E1.grid(row=0, column=1)
# Checkbox
self.CB_var = BooleanVar()
self.CB = Checkbutton(root, text="Get text", variable=self.CB_var, command=lambda: FileB.get_text(self))
self.CB.grid(row=0, column=2)
root = Tk() # initialize blank window
root.geometry("500x500")
GUI(root)
root.mainloop()
文件B(FileB.py)
from tkinter import DISABLED, NORMAL, END
def get_text(gui):
if gui.CB_var.get() == True:
entry_text = gui.E1.get()
gui.E1.config(state=DISABLED)
print(entry_text)
gui.E1.delete(0, END)
else:
gui.E1.config(state=NORMAL)
print("Checkbox not selected")