Python 在tkinter中,在画布上提起并升起画布

Python 在tkinter中,在画布上提起并升起画布,python,python-3.x,canvas,tkinter,python-3.4,Python,Python 3.x,Canvas,Tkinter,Python 3.4,我正在创建一个游戏,我正在使用tkinter构建GUI 在这个游戏中,我希望用户从一个由画布填充的窗口开始,以图像为背景,在某种项目窗口中使用一些按钮。这个画布是游戏的主画布 问题是,我希望用户单击一个按钮以在其他画布上着陆,而其他画布将承载其他内容,如地图或其他操作的其他按钮。实际上,我想叠加几个画布(如Z-index方法),并在需要时(例如,如果我单击按钮)将画布放在列表顶部 我已经搜索过了,我不得不改变主意好几次,现在我真的不知道怎么做 我在这里找到了关于堆栈溢出的以下代码,但它是为Pyt

我正在创建一个游戏,我正在使用tkinter构建GUI

在这个游戏中,我希望用户从一个由画布填充的窗口开始,以图像为背景,在某种项目窗口中使用一些按钮。这个画布是游戏的主画布

问题是,我希望用户单击一个按钮以在其他画布上着陆,而其他画布将承载其他内容,如地图或其他操作的其他按钮。实际上,我想叠加几个画布(如Z-index方法),并在需要时(例如,如果我单击按钮)将画布放在列表顶部

我已经搜索过了,我不得不改变主意好几次,现在我真的不知道怎么做

我在这里找到了关于堆栈溢出的以下代码,但它是为Python2编写的(我想),我开始用Python3编写代码,所以我无法将其转换为Python3并解决我的问题

import Tkinter as tk

class SampleApp(tk.Tk):

   def __init__(self, *args, **kwargs):
       tk.Tk.__init__(self, *args, **kwargs)
       self.frame = tk.Frame(self)
       self.frame.pack(side="top", fill="both", expand=True)
       self.label = tk.Label(self, text="Hello, world")
       button1 = tk.Button(self, text="Click to hide label",
                           command=self.hide_label)
       button2 = tk.Button(self, text="Click to show label",
                           command=self.show_label)
       self.label.pack(in_=self.frame)
       button1.pack(in_=self.frame)
       button2.pack(in_=self.frame)

    def show_label(self, event=None):
        self.label.lift(self.frame)

    def hide_label(self, event=None):
        self.label.lower(self.frame)


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()
我的代码使用网格:

from tkinter import *

fenetre = Tk()
fenetre.title(my game)

# acceuil
# variable acceuil
largeur = 700
hauteur = 430

BG_acceuil = PhotoImage(file="BG_acceuil.gif")
acceuil = Canvas(fenetre, width=largeur, height=hauteur)
acceuil.create_image(0, 0, anchor=NW, image=BG_acceuil)
acceuil.grid(row=0)
acceuil.pack()

# fond
fond = PhotoImage(file="BG_acceuil.gif")
acceuil2 = Canvas(fenetre, width=largeur, height=hauteur)
acceuil2.create_image(0, 0, anchor=NW, image=fond)
acceuil2.pack()

# variable bt_jouer
x0 = 80
y0 = 230


class hide_me():

    def hide_me(event, widget, pos):
        widget.grid_forget()

    def show_me(event, widget, pos):
        widget.grid(row=pos)


# Boutton jouer
BT_jouer = Button(acceuil, text="Jouer", command=hide_me())
BT_jouer.configure(width=10, activebackground="#33B5E5", relief=GROOVE)
BT_jouer_window = acceuil.create_window(x0, y0, window=BT_jouer,)
BT_jouer.bind('<Button-1>', lambda event: hide_me(event, BT_jouer, 1))
BT_jouer.grid(row=1)

# Bouton règle
BT_regle = Button(acceuil2, text="Règles", command=fenetre.destroy)
BT_regle.configure(width=10, activebackground="#33B5E5", relief=FLAT,    bd=0)
BT_regle_window = acceuil2.create_window(x0, y0 + 50, window=BT_regle)

# Boutton quitter
BT_quit = Button(acceuil, text="Quitter", command=fenetre.destroy)
BT_quit.configure(width=10, activebackground="#33B5E5", relief=FLAT)
BT_quit_window = acceuil.create_window(x0, y0 + 100, window=BT_quit)

fenetre.mainloop()
从tkinter导入*
fenetre=Tk()
费内特。标题(我的游戏)
#阿克伊尔
#可变附件
大耳=700
傲慢=430
BG_acceuil=PhotoImage(file=“BG_acceuil.gif”)
acceuil=帆布(宽=大,高=高傲)
acceuil.create_image(0,0,anchor=NW,image=BG_acceuil)
acceuil.grid(行=0)
acceuil.pack()
#喜爱的
fond=PhotoImage(file=“BG\u acceuil.gif”)
acceuil2=画布(宽度=大,高度=傲慢)
acceuil2.create_image(0,0,anchor=NW,image=fond)
acceuil2.pack()
#可变温度
x0=80
y0=230
类hide_me():
def隐藏(事件、小部件、pos):
widget.grid_忘记()
def显示(事件、小部件、pos):
widget.grid(行=位置)
#布顿焦耳
BT_jouer=按钮(acceuil,text=“jouer”,command=hide_me())
BT#u jouer.configure(宽度=10,activebackground=“#33B5E5”,浮雕=凹槽)
创建窗口(x0,y0,window=BT\u-jouer,)
绑定(“”,lambda事件:hide_me(事件,BT_jouer,1))
BT_jouer.网格(行=1)
#布顿雷格尔酒店
BT_regle=按钮(acceuil2,text=“Règles”,command=fenetre.destroy)
BT#regle.configure(宽度=10,activebackground=“#33B5E5”,浮雕=FLAT,bd=0)
BT_regle_window=acceuil2.创建_window(x0,y0+50,window=BT_regle)
#布顿戒烟器
BT_quit=按钮(acceuil,text=“Quitter”,command=fenetre.destroy)
BT#u quit.configure(宽度=10,activebackground=“#33B5E5”,浮雕=FLAT)
BT\u quit\u window=acceuil.create\u window(x0,y0+100,window=BT\u quit)
fenetre.mainloop()

答案很简单:要转换为Python 3,将Tkinter更改为Tkinter,它就可以工作了

import tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
       tk.Tk.__init__(self, *args, **kwargs)
       self.frame = tk.Frame(self)
       self.frame.pack(side="top", fill="both", expand=True)
       self.label = tk.Label(self, text="Hello, world")
       button1 = tk.Button(self, text="Click to hide label",
                           command=self.hide_label)
       button2 = tk.Button(self, text="Click to show label",
                           command=self.show_label)
       self.label.pack(in_=self.frame)
       button1.pack(in_=self.frame)
       button2.pack(in_=self.frame)

    def show_label(self, event=None):
        self.label.lift(self.frame)

    def hide_label(self, event=None):
        self.label.lower(self.frame)

def main():
    app = SampleApp()
    app.mainloop()  
    return 0

if __name__ == '__main__':
    main()
注意:您并没有真正隐藏标签-它仍然占据画布上的空间,从该条目中,真正删除该项。然后可以通过pack()调用调用调用它:

从Tkinter导入*
def hide_me(事件):
event.widget.pack_-forget()
root=Tk()
btn=按钮(根,text=“单击”)
绑定(“”,隐藏我)
btn.pack()
btn2=按钮(根,text=“单击太多”)
绑定(“”,隐藏我)
btn2.pack()
root.mainloop()
我做了一些测试,并做了一个与你相同的程序。。。唯一的问题是,未隐藏的小部件始终打包在末尾:

from tkinter import *

def hide_me(event, widget):
    widget.pack_forget()

def show_me(event, widget):
    widget.pack()

root = Tk()
lbl = Label(root, text="Victim")

btn = Button(root, text="Hide the victim")
btn.bind('<Button-1>', lambda event: hide_me(event, lbl))
btn.pack()

btn2 = Button(root, text="Show the victim")
btn2.bind('<Button-1>', lambda event: show_me(event, lbl))
btn2.pack()

lbl.pack()

root.mainloop()
从tkinter导入*
def hide_me(事件、小部件):
widget.pack_忘记()
def显示(事件、小部件):
widget.pack()
root=Tk()
lbl=标签(根,text=“受害者”)
btn=按钮(root,text=“隐藏受害者”)
绑定(“”,lambda事件:隐藏(事件,lbl))
btn.pack()
btn2=按钮(root,text=“显示受害者”)
btn2.bind(“”,lambda事件:show_me(事件,lbl))
btn2.pack()
lbl.pack()
root.mainloop()
更好的版本使用grid()打包器。在这里,您可以将“遗忘”小部件恢复到其原始位置。只是稍微复杂一点:)

从tkinter导入*
def隐藏(事件、小部件、pos):
widget.grid_忘记()
def显示(事件、小部件、pos):
widget.grid(行=位置)
root=Tk()
lbl=标签(根,text=“受害者”)
lbl.网格(行=0)
btn=按钮(root,text=“隐藏受害者”)
绑定(“”,lambda事件:隐藏(事件,lbl,0))
btn.网格(行=1)
btn2=按钮(root,text=“显示受害者”)
btn2.bind(“”,lambda事件:show_me(事件,lbl,0))
btn2.网格(行=2)
root.mainloop()

编辑:评论中的另一个观察结果:Bryan Oakley评论说,如果您使用
.grid\u remove()
而不是
.grid\u遗忘()
,那么坐标不会丢失,一个简单的
.grid()
将在其位置恢复小部件。

您的意思是我不能与堆栈的最后一个对象交互,一旦上述对象被隐藏?在这种情况下,我至少会让他们不流血,对吗?当你说一个物体可以被移除和召回时,它是被摧毁和重建的吗?因为,我试图不破坏任何对象。我读到的注释是,该对象保留在堆栈上,只有pack()应该能够还原。pack\u forget()应该能够还原它。我试过了,但效果不太好。这可能是因为pack()是顺序的,它不存储其位置。请尝试grid(),在其中指定实际行位置。有一个grid_forget()要隐藏,grid()应该还原。编辑了上面的回复:如果你真的告诉它在哪里,可以将“遗忘”小部件还原到其原始位置。好的,感谢你之前的编辑,我对如何操作有了更精确的想法。关键是我想让画布上的按钮与之分离,而不是这样,在我不做任何动作的情况下,我得到第二块画布,应该称之为画布的按钮,站在窗口顶部。。我将编辑我的问题。如果您使用
grid\u remove
而不是
grid\u forget
,您可以不带参数调用
.grid()
,前面的参数将被记住。这使得代码更易于维护,因为原始布局中的更改不需要任何其他代码中的相应更改。
from tkinter import *

def hide_me(event, widget):
    widget.pack_forget()

def show_me(event, widget):
    widget.pack()

root = Tk()
lbl = Label(root, text="Victim")

btn = Button(root, text="Hide the victim")
btn.bind('<Button-1>', lambda event: hide_me(event, lbl))
btn.pack()

btn2 = Button(root, text="Show the victim")
btn2.bind('<Button-1>', lambda event: show_me(event, lbl))
btn2.pack()

lbl.pack()

root.mainloop()
from tkinter import *

def hide_me(event, widget, pos):
    widget.grid_forget()

def show_me(event, widget, pos):
    widget.grid(row = pos)

root = Tk()
lbl = Label(root, text="Victim")
lbl.grid(row = 0)

btn = Button(root, text="Hide the victim")
btn.bind('<Button-1>', lambda event: hide_me(event, lbl, 0))
btn.grid(row = 1)

btn2 = Button(root, text="Show the victim")
btn2.bind('<Button-1>', lambda event: show_me(event, lbl, 0))
btn2.grid(row = 2)


root.mainloop()