如何在python中的文件之间使用tkinter小部件?

时间:2019-03-31 20:47:10

标签: python file tkinter widget structure

我对编程还比较陌生,我注意到随着代码的增长,将所有内容编码为2个文件(设置和main)变得非常混乱。 但是,当我将代码拆分为多个文件时,遇到了无法导入fileB.py intro FileA.py并无法在文件B中使用文件A中的变量或小部件的问题(我得到未定义的名称错误)。

我将tkinter用于UI,所以我的主文件是tk循环(main.py)。每个按钮表示不同文件中的功能。在我的功能包括按钮状态或输入文本之前,它一直很好。

此示例与tkinter一起使用,但由于我相信我的代码结构,因此在很多情况下都会遇到此问题。

文件A(main.py)

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()

FileB(FileB.py)

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中的变量,所以实际输出是未定义的名称错误。

1 个答案:

答案 0 :(得分:0)

由于FileBmain.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")