我是否应该将 tkinter Toplevel 用于文本小部件?
Should I use tkinter Toplevel for Text widget or not?
我正在尝试使用带有文本框的 tkinter Toplevel window 到 post 到主 window 中的文本框,但我不断收到以下错误:
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
在下面的脚本中,我将 Toplevel 中的文本小部件称为“littletext”,将主 window 中的文本小部件称为“BIGTEXT”。我还尝试将文本框设置为 StringVars,正如大多数教程和脚本所建议的那样是正确的,但 StringVars 似乎更适用于条目(而非文本)框。
我想知道我是否应该使用自定义 class 而不是 Toplevel,尽管我不确定我将如何处理它是否可行。
我的代码如下。
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()
修复 NameError
的一种方法是将其作为 [=25] 函数实例的属性,这是因为它是代码中 openDIALOG()
函数中的局部变量=].这比使用全局变量更好,后者是另一种选择,但是 global variables are bad.
Whosebug 无意取代现有的教程或文档,因此我只会非常简要地描述下面的演示代码的作用。如果您花时间学习,大多数在线提供的 Python 教程都会更全面地介绍这个主题。
因此,根据您问题中的代码,这可能是如何完成的。请注意 littletext
现在是 self.littletext
。这是因为它已变成已定义的 class MY_DIALOG
的 class 属性,因此可以通过 self
参数访问它,该参数将自动作为所有参数的第一个参数传递class' 函数(称为 class“方法”)。
import tkinter as tk
from tkinter.constants import *
class MyDialog:
def __init__(self, window):
DIALOG = tk.Toplevel(window)
DIALOG.title("DIALOG")
DIALOG.geometry("400x300+100+100")
self.littletext = tk.Text(DIALOG, height=15)
self.littletext.pack()
btn1 = tk.Button(DIALOG, text="POST TO MAIN WINDOW", command=self.GetFromDIALOG)
btn1.pack(side="left")
btn2 = tk.Button(DIALOG, text="EXIT", command=DIALOG.destroy)
btn2.pack(side="left")
def GetFromDIALOG(self):
X = self.littletext.get("1.0", END)
print(X)
if __name__ == '__main__':
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: MyDialog(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=lambda: MyDialog(window))
BUTTON.pack()
window.mainloop()
谢谢马蒂诺! :)
我清理了一些小问题。
您编写的对话框没有 post 返回到主要的 BIGTEXT window,所以我完成了它的回调方面。
主 window 页脚中的 BUTTON 实际上是我的一个错误。原来不小心忘记删了post,所以这里删了,让菜单工作调用。
最终代码如下。
import tkinter as tk
from tkinter.constants import *
class MY_DIALOG:
def __init__(self, window):
DIALOG = tk.Toplevel(window)
DIALOG.title("DIALOG")
DIALOG.geometry("400x300+100+100")
self.littletext = tk.Text(DIALOG, height=15)
self.littletext.pack()
btn1 = tk.Button(DIALOG, text="POST TO MAIN WINDOW", command=self.GetFromDIALOG)
btn1.pack(side="left")
btn2 = tk.Button(DIALOG, text="EXIT", command=DIALOG.destroy)
btn2.pack(side="left")
def GetFromDIALOG(self):
X = self.littletext.get("1.0","end")
BIGTEXT.insert("end", X)
self.littletext.delete("1.0","end")
if __name__ == '__main__':
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: MY_DIALOG(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()
window.mainloop()
我正在尝试使用带有文本框的 tkinter Toplevel window 到 post 到主 window 中的文本框,但我不断收到以下错误:
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
在下面的脚本中,我将 Toplevel 中的文本小部件称为“littletext”,将主 window 中的文本小部件称为“BIGTEXT”。我还尝试将文本框设置为 StringVars,正如大多数教程和脚本所建议的那样是正确的,但 StringVars 似乎更适用于条目(而非文本)框。
我想知道我是否应该使用自定义 class 而不是 Toplevel,尽管我不确定我将如何处理它是否可行。
我的代码如下。
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()
修复 NameError
的一种方法是将其作为 [=25] 函数实例的属性,这是因为它是代码中 openDIALOG()
函数中的局部变量=].这比使用全局变量更好,后者是另一种选择,但是 global variables are bad.
Whosebug 无意取代现有的教程或文档,因此我只会非常简要地描述下面的演示代码的作用。如果您花时间学习,大多数在线提供的 Python 教程都会更全面地介绍这个主题。
因此,根据您问题中的代码,这可能是如何完成的。请注意 littletext
现在是 self.littletext
。这是因为它已变成已定义的 class MY_DIALOG
的 class 属性,因此可以通过 self
参数访问它,该参数将自动作为所有参数的第一个参数传递class' 函数(称为 class“方法”)。
import tkinter as tk
from tkinter.constants import *
class MyDialog:
def __init__(self, window):
DIALOG = tk.Toplevel(window)
DIALOG.title("DIALOG")
DIALOG.geometry("400x300+100+100")
self.littletext = tk.Text(DIALOG, height=15)
self.littletext.pack()
btn1 = tk.Button(DIALOG, text="POST TO MAIN WINDOW", command=self.GetFromDIALOG)
btn1.pack(side="left")
btn2 = tk.Button(DIALOG, text="EXIT", command=DIALOG.destroy)
btn2.pack(side="left")
def GetFromDIALOG(self):
X = self.littletext.get("1.0", END)
print(X)
if __name__ == '__main__':
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: MyDialog(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=lambda: MyDialog(window))
BUTTON.pack()
window.mainloop()
谢谢马蒂诺! :)
我清理了一些小问题。
您编写的对话框没有 post 返回到主要的 BIGTEXT window,所以我完成了它的回调方面。
主 window 页脚中的 BUTTON 实际上是我的一个错误。原来不小心忘记删了post,所以这里删了,让菜单工作调用。
最终代码如下。
import tkinter as tk
from tkinter.constants import *
class MY_DIALOG:
def __init__(self, window):
DIALOG = tk.Toplevel(window)
DIALOG.title("DIALOG")
DIALOG.geometry("400x300+100+100")
self.littletext = tk.Text(DIALOG, height=15)
self.littletext.pack()
btn1 = tk.Button(DIALOG, text="POST TO MAIN WINDOW", command=self.GetFromDIALOG)
btn1.pack(side="left")
btn2 = tk.Button(DIALOG, text="EXIT", command=DIALOG.destroy)
btn2.pack(side="left")
def GetFromDIALOG(self):
X = self.littletext.get("1.0","end")
BIGTEXT.insert("end", X)
self.littletext.delete("1.0","end")
if __name__ == '__main__':
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: MY_DIALOG(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()
window.mainloop()