【问题标题】:Can't get code to work with new window button - Tkinter无法让代码使用新窗口按钮 - Tkinter
【发布时间】:2021-11-04 00:10:16
【问题描述】:

我是 Python 和 Tkinter 的新手,我正在尝试制作一个带有按钮的窗口,当按下该按钮时,会在新窗口中打开计算器的代码,我已经准备好计算器代码,它可以自行运行,但是当我复制它并试图让它与新窗口一起工作时,它只会打开一个空窗口。

打开新窗口的代码来自本教程:Open a new Window with a button in Python-Tkinter

计算器是由 FreeCodeCamp.org 的 tkinter 课程制作的,它有很多代码,其中包括 e.get,我认为这是我将其更改为 newWindow 的问题。

from tkinter import *
from tkinter.ttk import *
 
master = Tk()
 
master.geometry("200x200")
 
 
def openNewWindow():
    global newWindow
    newWindow = Toplevel(master)
    newWindow.title("New Window")
    newWindow = Entry(width=35, borderwidth=5)
    newWindow.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
    
    def button_click(number):
        current = newWindow.get()
        newWindow.delete(0, END)
        newWindow.insert(0, str(current) + str(number))

    def button_clear():
        newWindow.delete(0, END)

    def button_add():
        first_number = newWindow.get()
        global f_num
        global math
        math = "addition"
        f_num = int(first_number)
        newWindow.delete(0, END)

    def button_equal():
        second_number = newWindow.get()
        newWindow.delete(0, END)
    
        if math == "addition":
            newWindow.insert(0, f_num + int(second_number))

        if math == "subtraction":
            newWindow.insert(0, f_num - int(second_number))

        if math == "multiplication":
            newWindow.insert(0, f_num * int(second_number))

        if math == "devision":
            newWindow.insert(0, f_num /  int(second_number))

    def button_subtract():
        first_number = newWindowe.get()
        global f_num
        global math
        math = "subtraction"
        f_num = int(first_number)
        newWindow.delete(0, END)

    def button_multiply():
        first_number = newWindow.get()
        global f_num
        global math
        math = "multiplication"
        f_num = int(first_number)
        newWindow.delete(0, END)

    def button_devide():
        first_number = newWindow.get()
        global f_num
        global math
        math = "devision"
        f_num = int(first_number)
        newWindow.delete(0, END)

    button_1 = Button(root, text="1", padx=40, pady=20, command=lambda: button_click(1))
    button_2 = Button(root, text="2", padx=40, pady=20, command=lambda: button_click(2))
    button_3 = Button(root, text="3", padx=40, pady=20, command=lambda: button_click(3))
    button_4 = Button(root, text="4", padx=40, pady=20, command=lambda: button_click(4))
    button_5 = Button(root, text="5", padx=40, pady=20, command=lambda: button_click(5))
    button_6 = Button(root, text="6", padx=40, pady=20, command=lambda: button_click(6))
    button_7 = Button(root, text="7", padx=40, pady=20, command=lambda: button_click(7))
    button_8 = Button(root, text="8", padx=40, pady=20, command=lambda: button_click(8))
    button_9 = Button(root, text="9", padx=40, pady=20, command=lambda: button_click(9))
    button_0 = Button(root, text="0", padx=40, pady=20, command=lambda: button_click(0))
    button_add = Button(root, text="+", padx=39, pady=20, command=button_add)
    button_equal = Button(root, text="=", padx=91, pady=20, command=button_equal)
    button_clear = Button(root, text="C", padx=91, pady=20, command=button_clear)

    button_subtract = Button(root, text="-", padx=41, pady=20, command=button_subtract)
    button_multiply = Button(root, text="*", padx=40, pady=20, command=button_multiply)
    button_devide = Button(root, text="/", padx=41, pady=20, command=button_devide)

    # Put the buttons on the screen
    #myButton = Button(root, text="What is your name?", command=myClick)

    button_1.grid(row=3, column=0)
    button_2.grid(row=3, column=1)
    button_3.grid(row=3, column=2)

    button_4.grid(row=2, column=0)
    button_5.grid(row=2, column=1)
    button_6.grid(row=2, column=2)

    button_7.grid(row=1, column=0)
    button_8.grid(row=1, column=1)
    button_9.grid(row=1, column=2)

    button_0.grid(row=4, column=0)
    button_clear.grid(row=4, column=1, columnspan=2)
    button_add.grid(row=5, column=0)
    button_equal.grid(row=5, column=1, columnspan=2)

    button_subtract.grid(row=6, column=0)
    button_multiply.grid(row=6, column=1)
    button_devide.grid(row=6, column=2)
 
 
label = Label(master,
              text ="Window")
 
label.pack(pady = 10)
 
btn = Button(master,
             text ="Calculator",
             command = openNewWindow)
btn.pack(pady = 10)
 
mainloop()

【问题讨论】:

  • 这些方法是否应该在openNewWindow()下缩进?
  • 您没有创建任何包含在新窗口中的小部件 - 这是通过将其作为第一个参数传递给任何小部件构造函数来完成的。事实上,您无法使用当前代码在新窗口中创建任何小部件,因为您会立即覆盖 newWindow 变量。

标签: python tkinter


【解决方案1】:

在运行代码时观察终端。当窗口停止响应时,通常意味着 python 遇到错误并在终端中打印。看起来您仍然需要做一些工作才能将您的代码从独立状态迁移过来 - root 没有在任何地方定义。我还删除了from tkinter.ttk import *,它为我消除了一堆未知选项错误。

【讨论】:

    【解决方案2】:

    没有真正做整个事情(虽然我做了并且我学到了一些东西),这里是一个骨架:

    def openNewWindow():
        # Toplevel window uses pack manager, not grid manager
        newWindow = Toplevel(master)
        newWindow.title(...)
    
        # Create a frame as the only object in Toplevel.
        # The frame will contain the other objects and use the grid manager.
        frame = Frame(newWindow)
        frame.pack()
    
        # Create items in the frame and grid them
        entry = Entry(frame, width=35)
        entry.grid(row=0, ...)
        button_1 = Button(frame, text="1", command=...)
        button_1.grid(row=3, column=0, padx=4, pady=2)
        button_2 = Button(...)
        button_2.grid(...)
        ...
    

    用于操作文本输入框的内容:

        entry.get()
        entry.delete(0, END)
        entry.insert(0, str)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-02
      • 2017-06-14
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      相关资源
      最近更新 更多