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:在程序开始时调用一次函数?的主要内容,如果未能解决你的问题,请参考以下文章