【问题标题】:I need help to create a new TKinter window instead of extending the current one我需要帮助来创建一个新的 TKinter 窗口而不是扩展当前窗口
【发布时间】:2021-06-01 13:43:58
【问题描述】:

这是我想尝试并提出的数学挑战的代码,它提出了尽可能多的问题 但它会不断扩展窗口而不是创建一个新窗口,这也不会更新 scorestr。

关于如何让它“溶解”当前画布,然后关闭并重新打开带有新问题和更新分数的更新画布的任何帮助?

另外,如果有人知道如何在其中设置一个 60 秒的计时器,那将会对我有很大帮助。

图片显示了我遇到的问题。

请注意 仅在将整数转换为字符串后参考加号部分,其他部分尚未更新,因为加号仍然不起作用。

# generate random integer values
from random import randint
import tkinter as tk

score = 0

scorestr = ""

root = tk.Tk()


def game():

    for x in range(3):

        def f():
            global score
            score += 1
        for _ in range(1):
            symbol = randint(0, 0)

        # define symbol for equation

        if symbol == 0:
            maths = "plus"
            value1 = randint(0, 100)
            value2 = randint(0, 100)

        if symbol == 1:
            maths = "minus"
            value1 = randint(0, 100)
            value2 = randint(0, 100)

        if symbol == 2:
            maths = "times"
            value1 = randint(0, 12)
            value2 = randint(0, 12)

        if symbol == 3:
            maths = "divide"
            value1 = randint(1, 12)
            value2 = randint(1, 12)

        # generate some integers

        if value1 < value2:
            temp = value1
            value1 = value2
            value2 = temp
            temp == ""

        value1Str = str(value1)
        value2Str = str(value2)

        if maths == "plus":
            answer = value1 + value2

            canvas1 = tk.Canvas(root, width=400, height=300)
            canvas1.pack()

            entry1 = tk.Entry(root)
            canvas1.create_window(200, 140, window=entry1)

            def clickme():
                uanswer = entry1.get()
                uanswerint = int(uanswer)
                if uanswerint == answer:
                    label3 = tk.Label(root, text='Correct')
                    canvas1.create_window(200, 280, window=label3)
                    f()
                    scorestr = str(score)
                else:
                    label3 = tk.Label(root, text='Incorrect')
                    canvas1.create_window(200, 280, window=label3)
                root.after(1000, game)


            label1 = tk.Label(root, text="Score: " + scorestr)
            canvas1.create_window(200, 230, window=label1)

            label2 = tk.Label(root, text='What is ' + value1Str + ' + ' + value2Str)
            canvas1.create_window(200, 100, window=label2)

            button1 = tk.Button(text='Check Answer!', command=clickme)
            canvas1.create_window(200, 180, window=button1)

        if maths == "minus":
            answer = value1 - value2

            canvas1 = tk.Canvas(root, width=400, height=300)
            canvas1.pack()

            entry1 = tk.Entry(root)
            canvas1.create_window(200, 140, window=entry1)

            def clickme():
                uanswer = entry1.get()
                uanswerint = int(uanswer)
                if uanswerint == answer:
                    label3 = tk.Label(root, text='Correct')
                    canvas1.create_window(200, 280, window=label3)

                else:
                    label3 = tk.Label(root, text='Incorrect')
                    canvas1.create_window(200, 280, window=label3)
                quit()

            label1 = tk.Label(root, text=answer)
            canvas1.create_window(200, 230, window=label1)

            label2 = tk.Label(root, text='What is ' + value1Str + ' - ' + value2Str)
            canvas1.create_window(200, 100, window=label2)

            button1 = tk.Button(text='Check Answer!', command=clickme)
            canvas1.create_window(200, 180, window=button1)

        if maths == "times":
            answer = value1 * value2

            canvas1 = tk.Canvas(root, width=400, height=300)
            canvas1.pack()

            entry1 = tk.Entry(root)
            canvas1.create_window(200, 140, window=entry1)

            def clickme():
                uanswer = entry1.get()
                uanswerint = int(uanswer)
                if uanswerint == answer:
                    label3 = tk.Label(root, text='Correct')
                    canvas1.create_window(200, 280, window=label3)

                else:
                    label3 = tk.Label(root, text='Incorrect')
                    canvas1.create_window(200, 280, window=label3)
                quit()

            label1 = tk.Label(root, text=answer)
            canvas1.create_window(200, 230, window=label1)

            label2 = tk.Label(root, text='What is ' + value1Str + ' * ' + value2Str)
            canvas1.create_window(200, 100, window=label2)

            button1 = tk.Button(text='Check Answer!', command=clickme)
            canvas1.create_window(200, 180, window=button1)

        if maths == "divide":
            answer = value1 / value2

            canvas1 = tk.Canvas(root, width=400, height=300)
            canvas1.pack()

            entry1 = tk.Entry(root)
            canvas1.create_window(200, 140, window=entry1)

            def clickme():
                uanswer = entry1.get()
                uanswerint = int(uanswer)
                if uanswerint == answer:
                    label3 = tk.Label(root, text='Correct')
                    canvas1.create_window(200, 280, window=label3)

                else:
                    label3 = tk.Label(root, text='Incorrect')
                    canvas1.create_window(200, 280, window=label3)
                quit()

            label1 = tk.Label(root, text=answer)
            canvas1.create_window(200, 230, window=label1)

            label2 = tk.Label(root, text='What is ' + value1Str + ' / ' + value2Str)
            canvas1.create_window(200, 100, window=label2)

            button1 = tk.Button(text='Check Answer!', command=clickme)
            canvas1.create_window(200, 180, window=button1)

        root.mainloop()

game()


print (score)

Window Extending

【问题讨论】:

  • 这是因为每当执行game() 时,您都会创建新的画布。您应该在game() 之外创建画布,并使用canvas1.delete("all") 在每次调用中清除画布。此外,for 循环也完全没有必要。第一次调用game() 后的最后一步root.mainloop()。
  • 请将此代码缩减为minimal reproducible example。

标签: python tkinter time


【解决方案1】:

所以,如果你想在旧窗口打开的同时添加一个新窗口,那么你必须使用 Tkinter 中的 TopLevel 窗口。 Top1 = tk.Toplevel(root) 它应该会打开一个新窗口。

但是,如果你想删除根窗口并创建一个新窗口,你必须使用 root.destroy() 关闭任何根窗口。在按钮的功能内执行此操作

root = tk.Tk()再次打开窗口。

您必须再次添加画布和其他小部件才能更新。或者你可以简单地使用while循环来获取它

【讨论】:

  • 对于第二点,重用窗口比破坏旧窗口并创建新窗口要好得多。您还说,为了拥有 2 个窗口,您必须使用tk.Toplevel(...),但从技术上讲这是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多