Tkinter在2帧之间切换,同时尝试制作另一个命令

时间:2016-03-25 20:22:02

标签: python tkinter

更改页面的代码源自:Switch between two frames in tkinter

您好,我一直在试图弄清楚如何将此代码转换为我可以使用的内容,但我没有运气:(。我一直试图让这些按钮不仅切换页面,但同时做一个更简单的命令,我想不知何故我应该做1个功能,将做两件事,而不是2个单独的功能,但我仍然是新的python,甚至更多的tkinter和每次当我尝试更改这些按钮命令或功能时,我都会遇到某种错误,似乎我找不到办法做到这一点,你能帮我解决吗?提前谢谢。

编辑:我删除了一些不需要的代码,我认为需要休息。至于我失败的尝试,我将在此代码下面添加一些尝试。

from tkinter import *

class App(Tk):

    def __init__(self):
        Tk.__init__(self)

        container = Frame(self)
        container.pack(side="top", fill="both", expand = True)
        self.frames = {}

        for F in (StartPage, PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self,parent)
        label = Label(self, text="Start Page")
        label.pack(pady=10,padx=10)
        button = Button(self, text="Visit Page 1",
                            command=lambda: controller.show_frame(PageOne))
        button.pack()

class PageOne(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        label = Label(self, text="Page One!!!")
        label.pack(pady=10,padx=10)
        button1 = Button(self, text="Back to Home",
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()


    app = App()
    app.mainloop()

我一直在尝试将这两个功能结合起来:

def show_frame(self, cont):
    frame = self.frames[cont]
    frame.tkraise()

def calculate(self):
    e1 = self.v1.get()
    e2 = self.v2.get()
    entry1 = int(self.entry1.get())
    entry2 = int(self.entry2.get())
    k = entry1 * entry2
    print(k)

尝试从这两个中创建1个函数:

def run_all(self, cont):
    frame = self.frames[cont]
    frame.tkraise()
    e1 = self.v1.get()
    e2 = self.v2.get()
    entry1 = int(self.entry1.get())
    entry2 = int(self.entry2.get())
    k = entry1 * entry2
    print(k)

不确定在参数下放什么。 我也尝试更改此按钮命令:

    button = Button(self, text="Visit Page 1",
                    command=lambda: controller.show_frame(PageOne))
    button.pack()

尝试使用和不使用lambda编写此命令,但没有任何效果。

1 个答案:

答案 0 :(得分:1)

使用按钮可以通过多种方式完成多项操作。例如,我会先审核this effbot page,然后再进一步了解,或者另一个Tkinter教程

    def callback():
        controller.show_frame(PageOne)
        doSomethingElse()

    button = Button(root, command=callback)

在这种情况下,我们正在创建一个调用其他两个函数的函数。这是直观的解决方案。请注意,functions generated with the lambda关键字与其他任何功能相同 - 不要让您感到困惑。

这是你不应该做的事,虽然它可能有用

或者,写作

可能很诱人
    button = Button(root, command=lambda : [foo(), bar()]

在这种情况下,lambda函数将返回两个值的列表,需要通过调用这两个函数来计算。当然,该列表会被忽略,因为您没有使用返回值。

更糟糕的原因:

  • funcs = [foo,bar]; lambda : (f for f in funcs)可能,也可能不会。在python 2中,元组将被完全评估,但在python3中你会得到一个神秘的生成器表达式
  • 它不那么pythonic。创建一个匿名列表并不是我见过的有任何理由。相关的,任何看过方法#1(包括未来你)的人都会知道你在做什么。任何看过方法#2的人都会认为你不知道你在做什么
  • 在第一种情况下,您可以处理正在调用的实际功能。在第二种情况下,您有一个匿名函数返回的匿名列表。不需要两层隐藏
  • 它的可扩展性显着降低。如果您稍后决定要执行更复杂的操作,或者返回值彼此依赖,或者短路(等),则无法使用列表表示法执行此操作。如果您传递的是通用函数
  • ,则会执行此操作