更改Tkinter中的帧

时间:2017-07-10 19:34:35

标签: python tkinter frames

我一直在为一位家庭朋友的女儿教授一些基本的节目。我们在Python中创建了一个很好的基本文本冒险游戏,它的工作原理应该如此。但是,她真的想以图形方式看到它,所以我尝试使用我对Tkinter的极其基本的知识来实现​​它。每个章节都只是从前一个章节复制和粘贴,其中按钮标签和链接,文本框内容和图像引用已更改。我已将每个单独的屏幕放入一个单独的功能,通过单击上一个屏幕上的按钮来调用该功能。但是,我的问题是,它们不是用新的屏幕替换屏幕,而是彼此重叠。因此,第二章的图像,按钮和文字只是放在第一章的下面。

我无法找到一种方法来杀死以前的帧和小部件,并用新的替换它们。我试图用几种方法杀死它们,但它要么什么都不做,要么杀死整个程序。我也尝试在每个函数中使用相同的名称作为按钮,但因为它们是本地的,并没有真正有所作为。

虽然我意识到效率低下,但我想尝试尽可能远离使用物品,因为要向她解释是非常困难的。

有什么方法可以通过调整我创建的结构来实现这一点,还是只能通过使用复杂的类和对象来实现?请记住,这段代码永远不会被重用,所以它在后台有多乱。

from tkinter import *


root = Tk()

def intro():


  topFrame = Frame(root)
  topFrame.pack()
  bottomFrame = Frame(root)
  bottomFrame.pack(side = BOTTOM)

  photo = PhotoImage(file="hh.gif")
  label = Label(root, image=photo)
  label.pack(side = TOP)

  t = Text(wrap=WORD, height = 10)
  t.insert(INSERT, "This is the first screen")
  t.insert(END, "")
  t.pack()

  # button 1 here should take us to the second screen
  button1 = Button(bottomFrame, text="Option 1", fg="black", command=chapter2)
  button2 = Button(bottomFrame, text="Option 2", fg="black")
  button3 = Button(bottomFrame, text="Option 3", fg="black")

  button1.pack(side = LEFT)
  button2.pack(side = LEFT)
  button3.pack(side = LEFT)

  root.mainloop()


def chapter2():


  topFrame = Frame(root)
  topFrame.pack()
  bottomFrame = Frame(root)
  bottomFrame.pack(side = BOTTOM)

  photo1 = PhotoImage(file="hh2.gif")
  label1 = Label(root, image=photo1)
  label1.pack(side = TOP)

  t1 = Text(wrap=WORD)
  t1.insert(INSERT, "This is the second screen")
  t1.insert(END, "")
  t1.pack()

  button4 = Button(bottomFrame, text="this", fg="black")
  button5 = Button(bottomFrame, text="that", fg="black")
  button6 = Button(bottomFrame, text="the other", fg="black")

  button4.pack(side = LEFT)
  button5.pack(side = LEFT)
  button6.pack(side = LEFT)

  root.mainloop()

  intro()

2 个答案:

答案 0 :(得分:2)

您的代码中发生的是您正在创建新的文本字段和标签而不删除旧文本字段和标签。

要删除旧的文字/标签小工具,请使用pack_forget()t.pack_forget()label.pack_forget()button1.pack_forget()button2.pack_forget()和{{ 1}}。 button3.pack_forget()所做的是从窗口中移动窗口小部件,如pack_forget()的反面。因此,要在代码中添加它,只需更改第24行:

pack()

button1 = Button(bottomFrame, text="Option 1", fg="black", command=chapter2  

注意>在第二章中,您将使用button1 = Button(bottomFrame, text="Option 1", fg="black", command=lambda: (t.pack_forget(), label.pack_forget(), button1.pack_forget(), button2.pack_forget(), button3.pack_forget(), chapter2())) t1.pack_forget()label1.pack_forget() {{1} })

您还必须在标签上保留对照片的引用,您可以在button4/5/6.pack_forget()t/label/button1/2/3.pack_forget()之间添加label.image = photo来执行此操作。另请参阅this页面。
Entier编辑代码:

label = Label(topFrame, image=photo)

希望这有帮助,如果没有,请发表评论,我会尝试找到另一种解决方案:)

另外,如果您想知道lambda是什么(编辑代码的一部分),只需谷歌“python lambda”。

答案 1 :(得分:2)

基于mocqoro的答案,我建议你将每章放在一个框架中。这样,当您想要转到下一章时,您可以pack_forgetdestroypack_forget,如果您想稍后重新打包小部件,{{1}完全删除小部件)章节的框架而不是每个小部件:

destroy