HuN
HuN

Reputation: 139

Python tkinter: access child widgets of a widget

I have a string 'currentMessage' and a Label to display it. I have a Toplevel widget, which contains a Text widget to provide new value for '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()

I tried to get the content of 'textBox' Text widget of the Toplevel by using this function:

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

But I got an error

'Toplevel' object has no attribute 'textBox'

So how do I access content of the widget 'textBox', which is a child widget of 'popup' (this Toplevel widget is only created when function changeValues() is called)?

Upvotes: 4

Views: 4085

Answers (2)

user10796423
user10796423

Reputation: 21

There is a way indeed, like this:

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'

You can choose whatever you want for the 'name'.

Upvotes: 1

Peter Varo
Peter Varo

Reputation: 12180

I think probably this is what you are looking for -- although I'm just guessing, because you are asking for a solution for a specific problem you think you have, however if I were you I would rethink what exactly do I want to do:

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

Upvotes: 2

Related Questions