Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-tkinter按钮在执行第一个命令后不执行第二个命令_Python_Python 3.x_Tkinter - Fatal编程技术网

Python-tkinter按钮在执行第一个命令后不执行第二个命令

Python-tkinter按钮在执行第一个命令后不执行第二个命令,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,在下面我的程序的简化版本中,我希望“显示结果”按钮(或代码中的resultPage按钮)首先总结用户输入的点,然后将其带到新页面。但是,当我添加了一个函数,该函数将检查计算是否已被处理,并将用户带到一个新页面(def confirm,在代码中),什么都没有发生,我可以看到正在进行计算,但程序不会打开新页面 我想知道你如何修复这个错误 我的代码: from tkinter import * import tkinter.ttk as ttk class CollegeApp(Tk):

在下面我的程序的简化版本中,我希望“显示结果”按钮(或代码中的
resultPage
按钮)首先总结用户输入的点,然后将其带到新页面。但是,当我添加了一个函数,该函数将检查计算是否已被处理,并将用户带到一个新页面(
def confirm
,在代码中),什么都没有发生,我可以看到正在进行计算,但程序不会打开新页面

我想知道你如何修复这个错误

我的代码:

from tkinter import *
import tkinter.ttk as ttk


class CollegeApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        container = ttk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        self.frames = {}
        for F in (StartPage, counterPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)
        self.lift()

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


class StartPage(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        ttk.Frame.__init__(self, parent)
        self.startMenu()

    def startMenu(self):
        heading = Label(self, text="College Tournament Points\n Count Software",
                        font=('Arial', 25))
        heading.grid(row=0, column=0, columnspan=2, padx=240, pady=40)

        start_Btn = Button(self, text="START", font="Arial 16", width=8, height=2,
                           command=lambda: self.controller.show_frame(counterPage))
        start_Btn.grid(row=1, column=0, columnspan=2, padx=30, pady=5)

        exit_Btn = Button(self, text="EXIT", font="Arial 16", width=8, height=2,
                          command=self.controller.destroy)
        exit_Btn.grid(row=2, column=0, columnspan=2, padx=30, pady=5)

    def starting_Program(self):
        pass


class counterPage(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        ttk.Frame.__init__(self, parent)
        self.userEntry()

    def confirm(self):
        if self.get_values():
            self.controller.show_frame(resultPage)

    def get_values(self):
        def get_if_int(value):
            if value.isnumeric():
                return int(value)
            return 0

        pointsTeam1 = []
        pointsTeam1.append(get_if_int(self.team1Points1.get()))
        pointsTeam1.append(get_if_int(self.team1Points2.get()))
        pointsTeam1.append(get_if_int(self.team1Points3.get()))
        pointsTeam1.append(get_if_int(self.team1Points4.get()))
        pointsTeam1.append(get_if_int(self.team1Points5.get()))

        print(sum(pointsTeam1))

        pointsTeam2 = []
        pointsTeam2.append(get_if_int(self.team2Points1.get()))
        pointsTeam2.append(get_if_int(self.team2Points2.get()))
        pointsTeam2.append(get_if_int(self.team2Points3.get()))
        pointsTeam2.append(get_if_int(self.team2Points4.get()))
        pointsTeam2.append(get_if_int(self.team2Points5.get()))

        print(sum(pointsTeam2))

    def userEntry(self):
        team1label = Label(self, text="Enter points for Team 1: ", font="Arial 20")
        team1label.grid(row=0, column=0, pady=10, padx=10)

        self.team1Points1 = Entry(self, width=2)
        self.team1Points1.grid(row=0, column=1)

        self.team1Points2 = Entry(self, width=2)
        self.team1Points2.grid(row=0, column=2)

        self.team1Points3 = Entry(self, width=2)
        self.team1Points3.grid(row=0, column=3)

        self.team1Points4 = Entry(self, width=2)
        self.team1Points4.grid(row=0, column=4)

        self.team1Points5 = Entry(self, width=2)
        self.team1Points5.grid(row=0, column=5)

        team2label = Label(self, text="Enter points for Team 2: ", font="Arial 20")
        team2label.grid(row=1, column=0, pady=10, padx=10)

        self.team2Points1 = Entry(self, width=2)
        self.team2Points1.grid(row=1, column=1)

        self.team2Points2 = Entry(self, width=2)
        self.team2Points2.grid(row=1, column=2)

        self.team2Points3 = Entry(self, width=2)
        self.team2Points3.grid(row=1, column=3)

        self.team2Points4 = Entry(self, width=2)
        self.team2Points4.grid(row=1, column=4)

        self.team2Points5 = Entry(self, width=2)
        self.team2Points5.grid(row=1, column=5)

        resultBtn = Button(self, text="Show Results", font="Arial 16", height=2, width=8,
                           command=lambda: self.confirm())
        resultBtn.grid(row=4, column=0, sticky=W, pady=245, padx=100)


class resultPage(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        ttk.Frame.__init__(self, parent)
        self.userEntry()

    def userEntry(self):
        newlabel = Label(self, text="New Page", font="Arial 20")
        newlabel.grid(row=2, column=0, pady=10, padx=10)


if __name__ == '__main__':
    pointsTeam1 = []
    pointsTeam2 = []
    app = CollegeApp()
    app.geometry("800x500")
    app.resizable(False, False)
    app.title('Points Counter')
    app.mainloop()
更新


错误<代码>递归错误:由于我无意中将函数<代码>定义确认<代码>的内容加倍到函数<代码>定义获取值<代码>中,因此超出了最大递归深度。该错误不再发生,但是我的问题仍然存在,因为新的问题没有出现在按钮上。在您的
确认
方法中,您有以下行:

if self.get_values():
但是,您的
get\u values
方法没有任何
return
语句,因此该条件将始终失败,因为
get\u values
将始终返回
None
。因此,首先,添加某种返回语句来传递
if

另外,
CollegeAPP
的构造函数方法中的这一行:

for F in (StartPage, counterPage):
如果这是您想要执行的方法,那么还应该在
resultPage
类中包含它。因此:

for F in (StartPage, counterPage, resultPage):

代码中还有很多问题需要解决,但希望这能帮助您实现您想要的功能。

counterPage.getvalues(…)
中,它立即调用自身,导致无限递归。
command=lambda:self.confirm()
应该是
command=lambda:self.confirm
。您希望将函数设置为命令,而不是调用函数的结果。我已更新了我的问题,错误已修复,但打开新页面的问题仍然存在remaims@Matthias若我去掉那个些括号,计算就不会开始,按钮也就不起作用了。但现在若你们调用
userEntry
,它就开始了,如果你按下按钮就不会。是的,它工作了,非常感谢你,我发现了我的错误。我知道我在代码中有很多问题,这只是我第一次使用用户界面创建程序。再次感谢你的帮助!