【问题标题】:Opening windows from other windows in tkinter从 tkinter 中的其他窗口打开窗口
【发布时间】:2013-04-29 01:29:25
【问题描述】:

这是我的代码:

#!/usr/bin/python

from Tkinter import *

def openWindowReasons():                        
    global win 

    win = Tk()                    

    win.title("Decem Rationes Computerum Programmandorum")

    buttonMaker("I", 1, 1, " I) Programmo computeres ne meus animus deceat ignavus." )                            #create buttons 1-10 
    buttonMaker("II", 2, 1, " II) Programmo computeres ut relaxem post scholam et gaudeam scholam esse perfectam.")
    buttonMaker("III", 3, 1, " III) Meo amico programmato programmo ut certem cum eo.")
    buttonMaker("IV", 4, 1, " IV) Alii homines qui boni porgrammi programmant ut facian pecuniam.")
    buttonMaker("V", 5, 1, " V) Alii homines scribunt tantam codem ut alii cogitent eos esse optimos.")
    buttonMaker("VI", 1, 3, " VI) Programmare est tam iocus ut sperem me programmaturum esse saepius.")
    buttonMaker("VII", 2, 3, " VII) Multi homines programmant tam ut non habent tempus faciendorum pensorum quod sunt quam insulso.")
    buttonMaker("VIII", 3, 3, " VIII) Programmo ut possim loqui de eo cum meis amicis.")
    buttonMaker("IX", 4, 3, " IX) Me inspirato ab caeteris programmo ut sim similaris eis.")
    buttonMaker("X", 5, 3, " X) Saepe programmo ne habeam audire mea matri quae dictit quam multa.")

    label_1 = Label(win, text="RATIONES")        
    label_1.grid(row=3, column=2)



def buttonMaker(a, b, c, d):
    f = "button" + a
    f= Button(win, text=a, commmand=openWindowR(str(d)))
    f.grid(row=int(b), column=int(c))


def openWindowR(d):
    newWin = Tk()

    newWin.title(str(d))

    g = "label" + d 

    g = Label(newWin, text=str(d)) 
    g.grid(row=3, column=3)


def openWindowAlt():
    newWin_1 = Toplevel()
    label_2 = Label(newWin_1, text="Magister Bartoloma tam sapiens ut Minerva, quae dea sapientae est, eum admiretur.")


root = Tk()            #create parent window

root.title("Main Page")

label = Label(root, text="Decem Rationes Computerum Programmandorum")    
label.grid(row=1, column=2)

button = Button(root, text="Decem Rationes", commmand=openWindowReasons())  
button.grid(row=3, column=3)

button_1= Button(root, text="Pleasant Alternative", commmand=openWindowAlt())  
button_1.grid(row=3, column=1)

root.mainloop()

每次我运行代码时,它都会立即打开所有窗口,而不是在用户按下按钮时...任何帮助将不胜感激...

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    这是因为您调用的是函数,而不是传递引用或使用 lambda 函数。

    f = Button(win, text=a, command=lambda d=d: openWindowR(str(d)))
    

    但是,这只是一个临时解决方案。您应该考虑在您的程序中使用类而不是全局变量和函数(让您的代码更加简洁和有条理!)。

    除了这个建议之外,您还创建了两个 Tk 实例。如果您需要创建一个新窗口,请使用 Toplevel 小部件,但 Tkinter 程序应该只有一个 Tk 元素。否则,可能会给您带来意想不到的问题。

    这与使用名为 Application 的类完全相同的实现,您可以在其中拥有 GUI 的所有功能。

    #!/usr/bin/python
    
    from Tkinter import *
    
    
    class Application:
        def __init__(self, master):
            self.master = master
            self.master.title("Main Page")
            self.label = Label(master, text="Decem Rationes Computerum Programmandorum")
            self.label.grid(row=1, column=2)
            self.button = Button(master, text="Decem Rationes", command=self.openWindowReasons)  
            self.button.grid(row=3, column=3)
            self.button_1= Button(master, text="Pleasant Alternative", command=self.openWindowAlt)  
            self.button_1.grid(row=3, column=1)
    
        def openWindowAlt(self):
            newWin_1 = Toplevel()
            label_2 = Label(newWin_1, text="Magister Bartoloma tam sapiens ut Minerva, quae dea sapientae est, eum admiretur.")
            label_2.pack()
    
        def openWindowReasons(self):                        
            self.toplevel = Toplevel()
            self.buttonMaker("I", 1, 1, " I) Programmo computeres ne meus animus deceat ignavus." )
            self.buttonMaker("II", 2, 1, " II) Programmo computeres ut relaxem post scholam et gaudeam scholam esse perfectam.")
            self.buttonMaker("III", 3, 1, " III) Meo amico programmato programmo ut certem cum eo.")
            self.buttonMaker("IV", 4, 1, " IV) Alii homines qui boni porgrammi programmant ut facian pecuniam.")
            self.buttonMaker("V", 5, 1, " V) Alii homines scribunt tantam codem ut alii cogitent eos esse optimos.")
            self.buttonMaker("VI", 1, 3, " VI) Programmare est tam iocus ut sperem me programmaturum esse saepius.")
            self.buttonMaker("VII", 2, 3, " VII) Multi homines programmant tam ut non habent tempus faciendorum pensorum quod sunt quam insulso.")
            self.buttonMaker("VIII", 3, 3, " VIII) Programmo ut possim loqui de eo cum meis amicis.")
            self.buttonMaker("IX", 4, 3, " IX) Me inspirato ab caeteris programmo ut sim similaris eis.")
            self.buttonMaker("X", 5, 3, " X) Saepe programmo ne habeam audire mea matri quae dictit quam multa.")
            label_1 = Label(self.toplevel, text="RATIONES")        
            label_1.grid(row=3, column=2)
    
        def buttonMaker(self, a, b, c, d):
            f = Button(self.toplevel, text="button" + a, command=lambda d=d: self.openWindowR(str(d)))
            f.grid(row=int(b), column=int(c))
    
        def openWindowR(self, d):
            newWin = Toplevel()
            newWin.title(str(d))
            g = Label(newWin, text="label" + d) 
            g.grid()
    
    
    root = Tk()
    app = Application(root)
    root.mainloop()
    

    【讨论】:

    • 谢谢,你能告诉我如何将类合并到其中
    • @unubtu 我看了你的回答片刻,如果它没有被删除,我会支持它!我认为它比我更清楚地解释了这个问题。
    • 顺便说一句,我尝试了您的建议,我使用了 lambda 并将实例更改为新窗口,但出现错误...
    • File "untitled.py", line 60, in button = Button(root, text="Decem Rationes", commmand=lambda: openWindowReasons()) #创建一个窗口带人在 init Widget.__init__( self, master, 'button', cnf, kw) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py”,第 1974 行,在 init (widgetName, self._w) + extra + self._options(cnf)) _tkinter.TclError: unknown option "-commmand"
    • @user2350801 那是因为它是原始问题中的错字(它是command,有两个“m”)。我已经更新了我的答案以显示使用类的可能实现,我希望它有所帮助。
    猜你喜欢
    • 2014-08-07
    • 2021-09-18
    • 2018-05-11
    • 2013-09-18
    • 2023-01-27
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多