【问题标题】:Creating a new window in tkinter that has the same widgets from the root window在 tkinter 中创建一个具有与根窗口相同的小部件的新窗口
【发布时间】:2021-09-26 20:45:02
【问题描述】:

我想创建一个 tkinter 窗口,当我单击按钮小部件时,它会打开一个新窗口,显示来自根/原始窗口的所有小部件,完全相同。本质上是创建根窗口的第二个实例,其中应用程序可以有多个用户,使用相同的 GUI,在不同的窗口中。

感谢任何帮助。

我的一个小部件示例:

    summary_output = Text(
                    master=window, 
                    height=8,
                    width=78,
                    bg="gray95",
                    borderwidth=2, 
                    relief="groove",
                    font=("Arial", 12))

我的窗口布局

    window = Tk()
    window.title("Data Viewer")
    window.geometry("750x950")
    window.configure(bg='white')
    window.iconphoto(False, tk.PhotoImage(file='icon.png'))

我有这个,但似乎无法从根窗口放置小部件:


    def new_window():
        newWindow = Toplevel(window)
        newWindow.geometry("750x950")
        newWindow.configure(bg='white')
        newWindow.iconphoto(False, tk.PhotoImage(file='icon.png'))
        upload_button.place(x=20, y=560)
        mainloop()

他们是不是要把master改成任何窗口?

编辑:

from tkinter import *

class StaticFrame(Frame):
    def __init__(self,master,*args,**kwargs):
        Frame.__init__(self,master,*args,**kwargs)

        # All your widgets
        Label(self,text='This is a reusable frame',font=(0,17)).place(x=0, y=0)
        Button(self,text='Click me for nothing').pack()
        Label(self,text='End of page').pack()
        upload_button = Button(
                self, 
                text="Edit Data",
                fg="DodgerBlue4",
                font=("Graph Type", 15),
                height=1, width=12,
                borderwidth=2,
                relief="groove")
        upload_button.place(x=20, y=50)

root = Tk() # First window
top  = Toplevel(root) # Second window
root.geometry("750x968")
StaticFrame(root).pack() # Put the frame on the first window
StaticFrame(top).pack() # Put the frame on the second window

root.mainloop()

结果:

【问题讨论】:

  • 请参阅this 了解有关作业问题的信息。此外,问题必须表明研究工作;目前,您的问题没有显示任何研究工作。 Stack Overflow 上有大量关于如何创建和使用类的信息。
  • 是的,但是您的问题非常广泛,并且已经有了答案。您想创建一个可以有多个相同实例的窗口,但不同用户的内容不同,对吗? Here are some related 关于自定义 tkinter 小部件的问题。
  • 我相信您也可以使用大量在线教程。做一些研究,并发挥创造力。如果您对某些特定代码有特定错误,我们很乐意提供帮助。您还可以在 SO 上搜索 [python] class inheritance 以获取有关类和创建自定义继承类的更多信息,但我给您链接的问题应该是一个开始。
  • @SamMatzko 如果它已经有了答案,为什么我找不到它们??
  • @TravisB:您的方法似乎是将小部件本身移动到一个新窗口中,这在 tkinter 中是不可能的。 upload_button 有一个,也只有一个,master,那就是window(不是newWindow);调用upload_button.place() 只会再次将其放入window。我提供的链接是关于另一种解决方案的:使用类和继承来创建一个自定义窗口类,它有自己的小部件。然后,您可以创建自定义窗口的实例,其方式与创建tkinter.Tk() 实例的方式大致相同。您可以拥有任何您想要的数据存储。

标签: python tkinter


【解决方案1】:

这里使用的概念很简单,创建一个“自定义框架”,我们将把它放到这些新窗口上,这样它将在不同的窗口中创建完全相同的框架和其中的小部件。

from tkinter import *

class StaticFrame(Frame):
    def __init__(self,master,*args,**kwargs):
        Frame.__init__(self,master,*args,**kwargs)

        # All your widgets
        Label(self,text='This is a reusable frame',font=(0,17)).pack()
        Button(self,text='Click me for nothing').pack()
        Label(self,text='End of page').pack()

root = Tk() # First window
top  = Toplevel(root) # Second window

StaticFrame(root).pack() # Put the frame on the first window
StaticFrame(top).pack() # Put the frame on the second window

root.mainloop()

代码非常简单,并且已经用 cmets 进行了解释,如果您不知道什么是类和继承,那么首先要检查这些。当我阅读这个问题时,我想到了许多其他方法,比如甚至有一个选项数据库并将小部件存储在一个列表中并根据其顺序重新创建它,但这似乎是最简单的。

【讨论】:

  • 这些按钮仅适用于“主”/第一个屏幕。我该如何解决这个问题?非常感谢
  • @TravisB master 是您作为主要小部件传递的任何屏幕,无论如何它应该是self,已更新答案
  • 当我放置它不起作用时,请查看编辑。
  • @TravisB 您的第一个窗口比第二个窗口大,因为您使用的是root.geometry("750x968"),您还期望会发生什么?
  • 不,我添加的标签元素在两个框架上根本不可见,请重新阅读代码。框架的大小不是我的问题。我在使用按钮时也有问题。只有一组在创建的最后一帧上起作用,第二组按钮不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2017-06-06
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多