从第二页的用户显示屏输入

问题描述 投票:0回答:2

我正在尝试从用户那里获取输入并将其显示在第二页上。它应该说“Hello”,然后是第一页输入框中的输入。我已经注释掉了不起作用的代码。其他一切都有效,因此复制粘贴会将工作片段放入 python 中。

    from tkinter import *
    from tkinter.ttk import Button
    
    window = Tk()
    window.title('In the Beginning')
    window.geometry("400x400")
    
    def Setting():
        name2.configure(text = 
        entry.get())
    
    name2 = Label(text = ' ')
    
    def window_2():
        window.destroy()
        window2 = Tk()
        nameLb = Label(text = 'Hello')
        nameLb.pack()
        """
        ender = Button(text = 'Quit!', command = window2.destroy())
        ender.pack()
        name2.pack()
        """
        window2.mainloop()

    greeting = Label(text = 'Name Your character:', fg = 'red', bg = 'white')
    greeting.pack()
    entry = Entry(fg = 'yellow', bg = 'blue', width = 50)
    entry.pack()
    setname = Button(text = 'set', command = Setting)
    setname.pack()
    kill = Button(text = 'Click here', command = window_2)
    kill.pack()
    name2.pack()

    window.mainloop()

按下设置按钮后,我的名字显示在第一页上。但由于某种原因,当我使用另一个按钮进入第二页时,我看到的只是“Hello”。如果我在第二页上有 ender 按钮,那么 Hello 标签就会消失。由于某种原因 command = window2.destroy(),按钮没有反应。

tkinter button label tkinter-entry
2个回答
0
投票

但由于某种原因,当我使用另一个按钮进入第二页时,我看到的只是你好。

这是因为你没有更新第二个窗口中的标签

nameLb

如果我在第二页上有结束按钮,那么“Hello”标签就会消失。由于某种原因 command = window2.destroy(),按钮没有反应。

这是因为

command = window2.destroy()
会立即执行
window2.destroy()
,所以在创建ender按钮之前,
原来的
第二个窗口就被销毁了。由于创建
ender
按钮时没有窗口,因此将显式创建另一个根窗口,并且
ender
按钮将是该窗口中唯一的小部件,并且其
command
选项被分配为
window2.destry()
的结果这是
None
。这就是为什么单击
ender
按钮时不执行任何操作。

注意,创建小部件时最好指定其

master

以下是修复上述问题的修改后的代码:

# avoid using wildcard import
import tkinter as tk
from tkinter import ttk

window = tk.Tk()
window.title('In the Beginning')
window.geometry("400x400")

def Setting():
    name2.configure(text=entry.get())

def window_2():
    # get what is input before destroying the first window
    who = entry.get()
    window.destroy()

    # create second window
    window2 = tk.Tk()
    window2.title("Window 2")
    window2.geometry("400x200")

    # better specify the master of widgets
    # and set the text of the label to what you want
    nameLb = tk.Label(window2, text=f'Hello {who}')
    nameLb.pack()

    # use command=window2.destroy instead
    ender = ttk.Button(window2, text='Quit!', command=window2.destroy)
    ender.pack()

greeting = tk.Label(window, text='Name Your character:', fg='red', bg='white')
greeting.pack()

entry = tk.Entry(window, fg='yellow', bg='blue', width=50)
entry.pack()

setname = ttk.Button(window, text='set', command=Setting)
setname.pack()

kill = ttk.Button(window, text='Click here', command=window_2)
kill.pack()

name2 = tk.Label(window)
name2.pack()

window.mainloop()

-1
投票

从第二页的用户显示屏输入

  • 添加 StringVar()
  • 将变量传递给
    entry = Entry(window, textvariable=ent,...)
  • 为 destroy_second_window() 创建函数
  • 评论
    ender
    按钮。

片段(已修改):

from tkinter import *
from tkinter.ttk import Button

window = Tk()
window.title('In the Beginning')
window.geometry("400x400")

def Setting():
    name2.configure(text = 
    entry.get())

name2 = Label(window) 

def window_2():
    window.withdraw()
    window2 = Toplevel()
    window2.title('Toplevel')
    nameLb = Label(window2, text = f'Hello {ent.get()}')
    nameLb.pack()

    def destroy_second_window():
        window2.destroy() 

    ender = Button(window2, text = 'Quit!', command=destroy_second_window)
    ender.pack()

    
ent = StringVar()     

greeting = Label(window,text = 'Name Your character:', fg = 'red', bg = 'white')
greeting.pack()
entry = Entry(window, textvariable=ent,fg = 'yellow', bg = 'blue', width = 50)
entry.pack()
setname = Button(window,text = 'set', command = Setting)
setname.pack()
kill = Button(window,text = 'Click here', command = window_2)
kill.pack()
name2.pack()

window.mainloop()

截图:

© www.soinside.com 2019 - 2024. All rights reserved.