Tkinter:在程序开始时调用一次函数?

Posted

技术标签:

【中文标题】Tkinter:在程序开始时调用一次函数?【英文标题】:Tkinter: Call a function once at the begining of a program? 【发布时间】:2018-09-24 17:38:54 【问题描述】:

我正在使用 Tkinter 创建一本书,我已将我的书的每一页定义为画布,我希望能够通过关闭当前画布(当前页面)并打开下一个画布(下一页)在页面之间切换.

我有两个问题:

    问题是当我使用命令Canvas.delete(can1)时画布没有关闭(我不知道为什么......),所以我尝试了Canvas.destroy(can1),但是当我想去的时候上一页我不能,因为我破坏了它(我认为这是问题所在)。是否有其他功能可以从我的主窗口中删除画布,但是如果我想重新打开它,我可以吗?

    如果你看代码(在最后),我需要使用 Button 来打开第一页,因为我无法将 'page1()' 放在 mainloop() 中。是否有命令在程序开始时调用一次函数?所以当我运行它时,第一页会自动打开...... (我希望你知道/理解我在搜索什么)。

我为我糟糕的英语和代码中的法语道歉.. ;)

代码在python 3.6中!

from tkinter import *
ModeleProiePredateur=Tk()
ModeleProiePredateur.title('Le Modele Proie-Predateur')

Largeur=1047
Hauteur=740

x=1

can1 = Canvas(ModeleProiePredateur,width=Largeur,height=Hauteur)
can2 = Canvas(ModeleProiePredateur,width=Largeur,height=Hauteur)
can3 = Canvas(ModeleProiePredateur,width=Largeur,height=Hauteur)

def affichage_page(page):
    if page == 1 :
        page1()
    if page == 2:
        page2()
    if page == 3 :
        page3()

def candel(cannum):
    if cannum == 1:
        Canvas.destroy(can1) #.destroy ne convient pas pour pouvoir reouvrir apres
    if cannum==2:
        Canvas.destroy(can2) #.delete de fonctionne pas comme prevu
    if cannum==3:
        Canvas.destroy(can3)

def pagesuivante():
    global x
    candel(x)
    x = x+1
    affichage_page(x)

def pageprecedente():
    global x
    y=x
    candel(y)
    y=y-1
    affichage_page(y)

def page1():

    can1.pack()
    planche = PhotoImage(file='/Users/loysforget1/Desktop/Planches/planche1.png')
    icon1 = can1.create_image(0,0, anchor='nw',image=planche)
    can1.photo = planche
    button1 = Button(ModeleProiePredateur, text = "Suivant", command = pagesuivante, anchor = N)
    button1.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
    button1_ModeleProiePredateur = can1.create_window(10, 730, anchor = SW, window=button1)

    button2 = Button(ModeleProiePredateur, text = "Precedent", command = pageprecedente, anchor = N)
    button2.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
    button2_ModeleProiePredateur = can1.create_window(100, 730, anchor = SW, window=button2)

    self.start()

def page2():

    can2.pack()
    planche = PhotoImage(file='/Users/loysforget1/Desktop/Planches/planche7.png')
    icon2 = can2.create_image(0,0, anchor='nw',image=planche)
    can2.photo = planche
    button1 = Button(ModeleProiePredateur, text = "Suivant", command = pagesuivante, anchor = N)
    button1.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
    button1_ModeleProiePredateur = can2.create_window(10, 730, anchor = SW, window=button1)

    button2 = Button(ModeleProiePredateur, text = "Precedent", command = pageprecedente, anchor = N)
    button2.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
    button2_ModeleProiePredateur = can2.create_window(100, 730, anchor = SW, window=button2)

def page3():

    can3.pack()
    planche = PhotoImage(file='/Users/loysforget1/Desktop/Planches/planche9.png')
    icon3 = can3.create_image(0,0, anchor='nw',image=planche)
    can3.photo = planche
    button1 = Button(ModeleProiePredateur, text = "Suivant", command = pagesuivante, anchor = N)
    button1.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
    button1_ModeleProiePredateur = can3.create_window(10, 730, anchor = SW, window=button1)

    button2 = Button(ModeleProiePredateur, text = "Precedent", command = pageprecedente, anchor = N)
    button2.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
    button2_ModeleProiePredateur = can3.create_window(100, 730, anchor = SW, window=button2)

Button(ModeleProiePredateur, text ='Page 1', command = page1).pack(side=RIGHT,padx = 5,pady = 5)

ModeleProiePredateur.mainloop()

【问题讨论】:

我强烈建议您查看问题Switch between two frames in tkinter 的公认答案,因为它说明了一个基于tkinter 的软件架构,可能非常适合您的应用程序。 【参考方案1】:

您无需不断破坏和重新创建每个页面。创建一次,然后将它们切换出去。

首先从每个页面中删除 pack 语句。该页面不应负责将自身置于其父级中。

接下来,在程序开始时创建所有页面。或者,将每个页面设置为None,然后在显示页面时首先检查它是否为None。如果是None,请在显示之前创建它。

第三,让你在页面之间移动的代码负责隐藏当前页面并显示新页面。

例如,您的 affichage_page 函数可能如下所示:

def affichage_page(page):
    global current_page
    if current_page is not None:
        current_page.pack_forget()
        current_page = None

    if page == 1 :
        current_page = can1
    if page == 2:
        current_page = can2
    if page == 3 :
        current_page = can3

    current_page.pack(fill="both", expand=True)

当然,您可以通过将页面存储在列表中来提高效率,这样您就可以使用页码作为索引,而不是使用一组if 语句。

然后你只需要在开始mainloop之前创建你的页面:

...
current_page = None
page1()
page2()
page3()
affichage_page(1)

ModeleProiePredateur.mainloop()

【讨论】:

以上是关于Tkinter:在程序开始时调用一次函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tkinter 在 GIF 中播放动画 [重复]

Python图形用户界面

Tkinter 按钮命令在运行程序时激活?

如何在Angular中启动应用程序时调用服务?

如何增加 Checkbutton 的大小 - Tkinter

在 MS-Windows 下调整大小导致的 Tkinter 性能问题