我正在尝试使用带有文本框的tkinter Toplevel窗口发布到主窗口中的文本框,但我不断收到以下错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\someone\ouch\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "<ipython-input-14-df46ff30dac4>", line 21, in GetFromDIALOG
X = littletext.get("1.0","end")
NameError: name 'littletext' is not defined
在下面的脚本中,我将顶层的文本小部件称为“littletext”,将主窗口中的文本小部件称为“BIGTEXT”。我还尝试将文本框设置为StringVars,因为大多数教程和脚本似乎都认为这是正确的,但StringVars似乎更适合于条目(而不是文本)框
我想知道我是否应该使用自定义类而不是顶级类,尽管我也不确定如何处理它
我的代码如下
import tkinter as tk
def openDIALOG(window):
DIALOG = tk.Toplevel(window)
DIALOG.title("DIALOG")
DIALOG.geometry("400x300+100+100")
littletext = tk.Text(DIALOG, height=15)
littletext.pack()
btn1 = tk.Button(DIALOG, text ="POST TO MAIN WINDOW", command=GetFromDIALOG)
btn1.pack(side="left")
btn2 = tk.Button(DIALOG, text ="EXIT", command = DIALOG.destroy)
btn2.pack(side="left")
def GetFromDIALOG ():
X = littletext.get("1.0","end")
print(X)
window = tk.Tk()
window.title("main")
menubar = tk.Menu(window)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="RUN A DIALOG", command=lambda:openDIALOG(window))
filemenu.add_command(label="Exit", command=window.destroy)
menubar.add_cascade(label="FILE", menu=filemenu)
window.config(menu=menubar)
BIGTEXT = tk.Text(window)
BIGTEXT.pack()
BUTTON = tk.Button(window, text="Post", command=openDIALOG)
BUTTON.pack()
window.mainloop()
谢谢马蒂诺!:)
我解决了一些小问题
您编写的对话框没有在主窗口中发回BIGTEXT,因此我完成了它的回调功能
主窗口页脚的按钮实际上是我的错误。我不小心忘了在原来的帖子中删除它,所以我在这里删除了它,让菜单在通话中起作用
最终代码如下
修复
NameError
的一种方法是使其成为类实例的属性,因为它是代码中openDIALOG()
函数中的局部变量。这比使用全局变量要好,全局变量是另一个选项,但是global variables are badStackoverflow并不是为了取代现有的教程或文档,所以我将只简单介绍下面的演示代码的作用。如果您花时间学习,在线提供的大多数Python教程都会更全面地介绍这个主题
下面是根据您问题中的代码可以实现的方法。注意
littletext
现在是self.littletext
。这是因为它已转换为已定义的class MY_DIALOG
的类属性,因此可以通过self
参数访问它,该参数将自动作为所有类函数(称为类“方法”)的第一个参数传递相关问题 更多 >
编程相关推荐