Python tkinter:访问小部件的子部件

4
我有一个字符串 'currentMessage' 和一个用于显示它的标签(Label)。 我有一个顶级窗口(Toplevel widget),其中包含一个文本(Text)小部件,以提供 'currentMessage' 的新值。
from tkinter import *
from tkinter import ttk

root = Tk()
mainFrame = ttk.Frame(root)
mainFrame.grid()
currentMessage = 'current Message'
ttk.Label(mainFrame, text = currentMessage).grid(padx = 10, pady = 10)

def updateCurrentMessage(popupWindow):
    currentMessage = popupWindow.textBox.get(0.0, END)

def changeValues():
    popup = Toplevel(mainFrame)
    popup.grid()
    textBox = Text(popup, width = 20, height = 5)
    textBox.grid(column = 0, row = 0)
    textBox.insert(END, 'new message here')
    b = ttk.Button(popup, command = lambda: updateCurrentMessage(popup))
    b.grid(column = 0, row = 1, padx = 5, pady = 5)
    b['text'] = 'Update'

theButton = ttk.Button(mainFrame, command = changeValues, text = 'Click')
theButton.grid(padx = 10, pady = 10)

mainFrame.mainloop()

我试图使用以下函数获取Toplevel中“textBox”文本部件的内容:

def updateCurrentMessage(popupWindow):
    currentMessage = popupWindow.textBox.get(0.0, END)

但是我遇到了一个错误

'Toplevel' 对象没有 'textBox' 属性

那么我该如何访问名为“textBox”的小部件的内容,它是“popup”的子部件(仅在调用函数changeValues()时才创建此Toplevel小部件)?


创建 class,使用 self 标记 textBox,使用 update_idletasks() - Alok
2个回答

2

我想这可能是你要找的内容——尽管我只是猜测,因为你正在寻找解决方案来解决你认为存在的具体问题,但如果我是你,我会重新考虑自己到底想做什么:

from tkinter import *
from tkinter import ttk

# Create Tk Interface root
root = Tk()

# Initialize mainFrame
mainFrame = ttk.Frame( root )
mainFrame.grid()

# Initialize label of mainframe
theLabel = ttk.Label( mainFrame, text='Current Message' )
theLabel.grid( padx=10, pady=10 )

def createPopup():
    # Initialize popup window
    popup = Toplevel( mainFrame )
    popup.grid()
    # Initialize text box of popup window
    textBox = Text( popup, width=20, height=5 )
    textBox.grid( column = 0, row = 0 )
    textBox.insert( END, 'New Message Here' )
    # Initialize button of popup window
    button = ttk.Button( master  = popup,
                         command = lambda: theLabel.config(text=textBox.get(0.0, END)),
                         text = 'Update')
    button.grid( column=0, row=1, padx=5, pady=5 )

# Initialize button of main frame
theButton = ttk.Button( mainFrame, command=createPopup, text='Click' )
theButton.grid( padx=10, pady=10 )

# Enter event loop
mainFrame.mainloop()

0

确实有一种方法,就像这样:

def updateCurrentMessage(popupWindow):
    currentMessage = popupWindow.nametowidget('textBox').get(0.0, END)

def changeValues():
    popup = Toplevel(mainFrame)
    popup.grid()
    textBox = Text(popup, width = 20, height = 5, name = 'textBox')
    textBox.grid(column = 0, row = 0)
    textBox.insert(END, 'new message here')
    b = ttk.Button(popup, command = lambda: updateCurrentMessage(popup))
    b.grid(column = 0, row = 1, padx = 5, pady = 5)
    b['text'] = 'Update'

你可以随意选择“名称”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接