2

我正在尝试使用带有文本框的 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”中的 Text 小部件和主窗口“BIGTEXT”中的 Text 小部件称为。我还尝试将文本框设置为 StringVars,因为大多数教程和脚本似乎都认为是正确的,但 StringVars 似乎更适用于条目(而不是文本)框。

我想知道是否应该使用自定义类而不是 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()
4

2 回答 2

0

修复 的一种方法NameError(由于它是openDIALOG()代码中函数中的局部变量)是使其成为类实例的属性。这比使用全局变量要好,这是另一种选择,但全局变量是 bad

Stackoverflow 并不打算取代现有的教程或文档,所以我将只非常简要地描述它下面的演示代码在做什么。如果您花时间学习,大多数在线提供的 Python 教程中都会更全面地介绍这个主题。

因此,这是根据您问题中的代码完成的方法。注意littletext现在的情况self.littletext。这是因为它已被转换为class MY_DIALOG已定义的类属性,因此可以通过self参数访问它,该参数将自动作为所有类函数的第一个参数传递(称为类“方法”) .

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

于 2021-09-05T01:33:47.550 回答
0

谢谢马蒂诺!:)

我清理了一些小问题。

您编写的对话框没有在主窗口中发回 BIGTEXT,因此我完成了它的回调方面。

主窗口页脚中的 BUTTON 实际上是我的一个错误。我不小心忘记在原始帖子中删除它,所以我在这里删除它并让菜单工作。

最终代码如下。

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()
于 2021-09-05T03:20:51.320 回答