【问题标题】:button command not excuting the function按钮命令不执行功能
【发布时间】:2019-09-26 20:30:04
【问题描述】:

我做了一个补角计算器,计算两个角度是否为补或等于 90,我还使用 tkinter 在 GUI 上工作,其中有一个按钮应该执行一个函数,但它没有,我一直在努力,但我不明白它有什么问题。

像下面这样的Tkinter按钮的命令必须执行一个功能

process = Button(root, text="click!", command=function).pack()

但在我的代码中,它不起作用,我不知道为什么。请有人帮助我!!! 这是我的代码:

from tkinter import *

root = Tk()
root.title("Complement angles calculator")
root.geometry("400x400+0+0")

heading_app = Label(root, text="Complement angles calculator", font=("arial", 20), fg="steelblue").pack()
angle1 = Label(root, text="First angle : ", font=("arial", 20), fg="black").place(x=10, y=80)

fir_angle = IntVar()
angle1_box = Entry(root, width=15, textvariable=fir_angle, bg="#ffffff").place(x=185, y=92)


angle2 = Label(root, text="Second angle : ", font=("arial", 20), fg="black").place(x=10, y=120)

sec_angle = IntVar()
angle2_box = Entry(root, width=15, textvariable=sec_angle, bg="#ffffff").place(x=220, y=132)

angles = fir_angle.get() + sec_angle.get()

def function():
    if angles == 90:
        text = Label(root, text="Resault :", font=("arial", 15)).place(x=155, y=250)
        text = Label(root, text="These are 90° Complement angles", font=("arial", 15)).place(x=50, y=300)

    if angles == 180:
        text = Label(root, text="Resault :", font=("arial", 15)).place(x=155, y=250)
        text = Label(root, text="These are 180° Complement angles", font=("arial", 15)).place(x=50, y=300)

    if angles == 360:
        text = Label(root, text="Resault :", font=("arial", 15)).place(x=155, y=250)
        text = Label(root, text="These are 360° Complement angles", font=("arial", 15)).place(x=50, y=300)

    if angles != 90 or angles != 180 or angles != 360:
        text = Label(root, text="Resault :", font=("arial", 15)).place(x=155, y=250)
        text = Label(root, text="These are NOT Complement angles", font=("arial", 15)).place(x=40, y=300)
function()

process = Button(root, text="Are these Complement angles ?", font=("arial", 15), command=function).place(x=50, y=175)

root.mainloop()


为什么不执行 function() ? 感谢您帮助我!

【问题讨论】:

  • 当我运行你的代码时,函数就会执行。为什么你认为它没有?你确定你的函数没有执行吗?还是它正在执行,只是没有按照您的预期执行?
  • function() 的结果完全由angles 决定,它是在您的程序启动期间计算的一次。因此,再次调用它不会改变屏幕上的任何内容。您需要将该计算移到函数中。

标签: python function button tkinter


【解决方案1】:

我们有一些事情要纠正。

首先让我们使用import tkinter as tk 而不是使用* 这样我们就不会覆盖其他导入。

接下来让我们清理您的变量。我们不需要命名一切。就是我们稍后要调用的东西。

接下来,我们需要将angles = fir_angle.get() + sec_angle.get() 移动到您的函数中,以便我们可以在需要时获取值。

接下来我们需要重命名你的函数,因为“function”是内部方法的名称,这会导致问题。

接下来让我们修正你的 if 语句。我们可以简单地检查一个值列表并使用format() 作为文本。

让我们用 try/except 添加一些错误处理。

您会注意到我正在使用config() 来更新标签,而不是尝试将标签放在一起。

import tkinter as tk

root = tk.Tk()
root.title('Complement angles calculator')
root.geometry('400x400+0+0')
fir_angle = tk.IntVar()
sec_angle = tk.IntVar()
tk.Label(root, text='Complement angles calculator', font=('arial', 20), fg='steelblue').pack()
tk.Label(root, text='First angle : ', font=('arial', 20), fg='black').place(x=10, y=80)
tk.Entry(root, width=15, textvariable=fir_angle, bg='#ffffff').place(x=185, y=92)
tk.Label(root, text='Second angle : ', font=('arial', 20), fg='black').place(x=10, y=120)
tk.Entry(root, width=15, textvariable=sec_angle, bg='#ffffff').place(x=220, y=132)
lbl1 = tk.Label(root, font=('arial', 15))
lbl1.place(x=155, y=250)
lbl2 = tk.Label(root, font=('arial', 15))
lbl2.place(x=50, y=300)


def func():  # do not call functions 'function' its a built in method
    try:
        angles = fir_angle.get() + sec_angle.get()
        lbl1.config(text='Resault :')
        if angles in [90, 180, 360]:
            lbl2.config(text='These are {}° Complement angles'.format(angles))
        else:
            lbl2.config(text='These are &$#@ Complement angles')
    except:
        lbl1.config(text='Error :')
        lbl2.config(text='Invalid values in entry fields')


tk.Button(root, text='Are these Complement angles ?', font=('arial', 15), command=func).place(x=50, y=175)
root.mainloop()

我还建议您对小部件使用 grid()pack() 而不是 place(),因为随着代码的增长,维护代码会容易得多。

这里是一个使用grid()的例子:

import tkinter as tk

root = tk.Tk()
root.title('Complement angles calculator')
root.geometry('400x300+0+0')
fir_angle = tk.IntVar()
sec_angle = tk.IntVar()
tk.Label(root, text='Complement angles calculator',
         font=('arial', 20), fg='steelblue').grid(row=0, column=0, columnspan=2, sticky='w')
tk.Label(root, text='First angle: ', font=('arial', 20), fg='black').grid(row=1, column=0, sticky='e')
tk.Entry(root, width=15, textvariable=fir_angle, bg='#ffffff').grid(row=1, column=1)
tk.Label(root, text='Second angle: ', font=('arial', 20), fg='black').grid(row=2, column=0, sticky='e')
tk.Entry(root, width=15, textvariable=sec_angle, bg='#ffffff').grid(row=2, column=1)
lbl1 = tk.Label(root, font=('arial', 15))
lbl1.grid(row=4, column=0, columnspan=2, pady=(20, 0))
lbl2 = tk.Label(root, font=('arial', 15))
lbl2.grid(row=5, column=0, columnspan=2)


def func():  # do not call functions 'function' its a built in method
    try:
        angles = fir_angle.get() + sec_angle.get()
        lbl1.config(text='Resault :')
        if angles in [90, 180, 360]:
            lbl2.config(text='These are {}° Complement angles'.format(angles))
        else:
            lbl2.config(text='These are &$#@ Complement angles')
    except:
        lbl1.config(text='Error :')
        lbl2.config(text='Invalid values in entry fields')


tk.Button(root, text='Are these Complement angles ?', font=('arial', 15),
          command=func).grid(row=3, column=0, columnspan=2)
root.mainloop()

结果: -- 不知道为什么这张图片这么大。实际图片很小。

【讨论】:

    【解决方案2】:

    你的函数正在执行。

    我怀疑问题在于您希望 angles 发生变化,但它不会。您将其设置为一个值,然后永远不要更改它。

    相反,您需要推迟调用get() 方法,直到调用该函数。

    def function():
        angles = fir_angle.get() + sec_angle.get()
        ...
    

    您还有一个逻辑问题,因为angles != 90 or angles != 180 or angles != 360 将始终为真,因为angles 不能同时为三个值。陈述的这三个部分中至少有两个部分总是正确的。

    例如,如果角度是 90 度(即:angles != 90False),angles != 180 将是 True,而 angles != 360 也将是 True,则声明 if False or True or True,即与if (False is True) or (True is True) or (True is True) 相同。

    【讨论】:

      【解决方案3】:

      尝试在按钮小部件之后添加这一行:

      process.pack()

      【讨论】:

      • OP 已经在使用 Place。这不会解决函数的问题。
      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2018-12-19
      • 1970-01-01
      相关资源
      最近更新 更多