【问题标题】:opening a new gui from the gui从 gui 打开一个新的 gui
【发布时间】:2019-06-18 18:21:59
【问题描述】:

按照以下 cmets 更新代码

我正在努力让我的顶层在按钮按下时打开!

我已经扫描了此处的代码,但似乎无法获得有效的解决方案。我最近的错误是:

AttributeError: '_tkinter.tkapp' 对象没有属性 'unavail'

    from tkinter import *
from ScheduleApi import flightData
import config
from itinerary import fltCreate

class FrontEnd:
    def __init__(self, master):
        self.master = master
        master.title("A simple GUI")

        self.label = Label(master, text="This is our first GUI!")
        self.label.grid()

        self.greet_button = Button(master, text="Create Itinerary", command=self.ItinBuilder)
        self.greet_button.grid(row=1)

        self.close_button = Button(master, text="Close", command=master.quit)
        self.close_button.grid(row=2)



    def greet(self):
        print("Greetings!")

    def ItinBuilder(self):
        self = Toplevel(self.master)
        self.title ("Please build your itinerary")

        self.addflt_button = Button(self.master, text="add flights", command=fltCreate)
        self.addflt_button.grid(row=1)

        self.addfhtl_button = Button(self.master, text="add hotel", command=self.master.unavail)
        self.addflt_button.grid(row=1, column=1)

        self.addfmsc_button = Button(self.master, text="add misc item", command=self.master.unavail)
        self.addflt_button.grid(row=2, column=1)

        self.prvitin_button = Button(self.master, text="preview", command=self.master.unavail)
        self.addflt_button.grid(row=2, column=1)



    def unavail(self,  Toplevel):
        print("Function not yet available.")



root = Tk()
my_gui = FrontEnd(root)
root.mainloop()

【问题讨论】:

  • 您的 FrontEnd 类不是从任何 Tkinter 类派生的,因此不是任何类型的小部件。这是构建 Tkinter 程序的一种完全有效的方法,但这确实意味着您不能将此类的实例作为您创建的任何小部件的第一个参数传递(例如,就像您对 self.addflt_button 所做的那样) - 您有传递一个实际的小部件,self.newWindow 也许。
  • 抱歉,我不明白。当我运行 ItinBuilder 时,我的第一行是传递小部件 self.newWindow = Toplevel(self.master)
  • @user3207324,您需要将有效的 tkinter 小部件作为第一个参数传递给任何 tkinter 小部件,这意味着将 self.masterself.newWindow 传递给在 ItinBuilder 函数中创建的小部件,而不是 @987654328 @。在您的情况下,当您将 self 传递给它时,它会尝试将 FrontEnd 对象视为 tkinter 小部件并失败。
  • 感谢您的帮助,我似乎快到了。我似乎到了那里,我还有 2 个问题仍然存在(对不起,我是一个完整的 tkinter 新手!)即使它是在 FrontEnd 类中定义的,ItinBuilder 仍在努力解决问题。此外,它现在至少可以创建添加航班按钮,但它将按钮放置在主 GUI 中,而不是新窗口中。更新代码如下: [[...] def ItinBuilder(self): self = Toplevel(self.master) self.title ("Please build your itinerary")]
  • 以上代码更新

标签: python user-interface tkinter tkinter-layout


【解决方案1】:

请将您的函数ItinBuilder 更改为此。我希望这是你所期望的。

def ItinBuilder(self):
    self.newWindow = Toplevel(self.master)
    self.newWindow.title ("Please build your itinerary")

    self.addflt_button = Button(self.newWindow, text="add flights", command=fltCreate)
    self.addflt_button.grid(row=0)

    self.addfhtl_button = Button(self.newWindow, text="add hotel", command=self.master.unavail)
    self.addfhtl_button.grid(row=0, column=1)

    self.addfmsc_button = Button(self.newWindow, text="add misc item", command=self.master.unavail)
    self.addfmsc_button.grid(row=1, column=0)

    self.prvitin_button = Button(self.newWindow, text="preview", command=self.master.unavail)
    self.prvitin_button.grid(row=1, column=1)

add flights 按钮位于主 GUI 中,因为您将主窗口 self.master 的引用作为代码中的第一个参数(在 tkinter 中称为父级)传递。

只看到 add_flights 按钮而不是其他按钮,因为您只为 self.addflt_button 而不是其他按钮调用了 grid 方法(我猜想在其他调用中更改变量名)。

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多