【问题标题】:tkinter calculator in pythonpython中的tkinter计算器
【发布时间】:2020-03-18 07:24:03
【问题描述】:

我是使用 tkinter 和 python 的新手,我正在尝试创建一个 GUI 窗口来计算约会之夜的总成本,并提供不同的旅行、娱乐等选项。我有两个主要问题: 1. 如果用户尝试输入提示,则没有任何反应。不过,只要用户不尝试留下餐厅小费,该程序就可以运行。我尝试过重新格式化,但我似乎无法弄清楚为什么我编写提示的方式不起作用。只有在选择了餐厅选项时才应该添加小费。 2.这个错误可能比较简单,但我不知道如何编写一个正确的“退出”按钮。我有几行代码,这是我在网上搜索解决方案后尝试制作退出按钮,但我似乎仍然缺少一些东西。

有很多代码,但我会在这里粘贴。我感谢任何建议或反馈:)

#import modules
import tkinter as tk
from tkinter import ttk

'''
calculate cost/make event handler for button push
'''

def calc_cost():
    #tax percent to decimal
    decimal = tax_result.get() / 100
    #if statement for tip
    if dinner_result.get() == 30:
        before_tax = travel_result.get() + entertainment_result.get() + dinner_result.get + ((int(tip_result.get()) / 100) * dinner_result)
    else:
        #find total before tax
        before_tax = travel_result.get() + entertainment_result.get() + dinner_result.get()
    #multiply tax decimal
    tax = before_tax * decimal
    #add to get total
    total_cost = before_tax + tax
    #assign 
    total_label["text"] = "$" + str(round(total_cost, 2))

#create window instance variable
app_window = tk.Tk()


'''
event handler quit button
'''
def close_window():
    app_window.destroy

'''
create radio options for travel
'''
#travel value variable
travel_result = tk.IntVar()

#frame shenanigans
travel_frame = ttk.Labelframe(app_window, text = "Travel")
travel_frame.grid(row = 1, column = 1, pady = 10, padx = 10)

#car radio button
car_radio = ttk.Radiobutton(travel_frame, variable = travel_result, value = 5)
car_radio.grid(row = 1, column = 1)
ttk.Label(travel_frame, text = "Car ($5)").grid(row = 1, column = 2, sticky = tk.W)

#bus radio button
bus_radio = ttk.Radiobutton(travel_frame, variable = travel_result, value = 1)
bus_radio.grid(row = 2, column = 1)
ttk.Label(travel_frame, text = "Bus ($1)").grid(row = 2, column = 2, sticky = tk.W)

#uber radio button
uber_radio = ttk.Radiobutton(travel_frame, variable = travel_result, value = 30)
uber_radio.grid(row = 3, column = 1)
ttk.Label(travel_frame, text = "Uber ($30)").grid(row = 3, column = 2, sticky = tk.W)

#limo radio button
limo_radio = ttk.Radiobutton(travel_frame, variable = travel_result, value = 200)
limo_radio.grid(row = 4, column = 1)
ttk.Label(travel_frame, text = "Limo ($200)").grid(row = 4, column = 2, sticky = tk.W)

'''
radio options for entertainment
'''

#entertainment value variable
entertainment_result = tk.IntVar()

#"framing" you for the crime ahaha
#jk just making a frame
entertainment_frame = ttk.Labelframe(app_window, text = "Entertainment")
entertainment_frame.grid(row = 2, column = 1, pady = 10, padx = 10)

#walk radio button
walk_radio = ttk.Radiobutton(entertainment_frame, variable = entertainment_result, value = 0)
walk_radio.grid(row = 1, column = 1)
ttk.Label(entertainment_frame, text = "Walk ($0)").grid(row = 1, column = 2, sticky = tk.W)

#mini golf radio button
golf_radio = ttk.Radiobutton(entertainment_frame, variable = entertainment_result, value = 10)
golf_radio.grid(row = 2, column = 1)
ttk.Label(entertainment_frame, text = "Mini Golf ($10)").grid(row = 2, column = 2, sticky = tk.W)

#movie radio button
#video killed the radio star :( RIP
movie_radio = ttk.Radiobutton(entertainment_frame, variable = entertainment_result, value = 26)
movie_radio.grid(row = 3, column = 1)
ttk.Label(entertainment_frame, text = "Movie ($26)").grid(row = 3, column = 2, sticky = tk.W)

'''
radio options for dinner
'''

#dinner value variable
dinner_result = tk.IntVar()

#dinner frame
dinner_frame = ttk.Labelframe(app_window, text = "Dinner")
dinner_frame.grid(row = 1, column = 2, pady = 10, padx = 10)

#fast food radio button
fast_radio = ttk.Radiobutton(dinner_frame, variable = dinner_result, value = 20)
fast_radio.grid(row = 1, column = 1)
ttk.Label(dinner_frame, text = "Fast Food ($20)").grid(row = 1, column = 2, sticky = tk.W)

#home made radio button
home_radio = ttk.Radiobutton(dinner_frame, variable = dinner_result, value = 15)
home_radio.grid(row = 2, column = 1)
ttk.Label(dinner_frame, text = "Home Made ($15)").grid(row = 2, column = 2, sticky = tk.W)

#restautant radio button
restaurant_radio = ttk.Radiobutton(dinner_frame, variable = dinner_result, value = 30)
restaurant_radio.grid(row = 3, column = 1)
ttk.Label(dinner_frame, text = "Restaurant ($30)").grid(row = 3, column = 2, sticky = tk.W)

'''
tax spinbox
'''

#tax variable
tax_result = tk.IntVar()

#frame
tax_frame = ttk.Labelframe(app_window, text = "Taxes in %")
tax_frame.grid(row = 2, column = 2, pady = 10, padx = 10)

#spinbox
tax_box = tk.Spinbox(tax_frame, from_=0, to=10, width = 5, justify = tk.RIGHT, textvariable = tax_result)
tax_box.grid(row = 1, column = 1, sticky = tk.W, pady = 3)

'''     
dinner tip scale 
'''

#result variable
tip_result = tk.IntVar()

# frame for the scale
tip_frame = ttk.Labelframe(app_window, text="Restaurant Tip Percent")
tip_frame.grid(row=1, column=3, pady=10, padx=10)

#tip scale range 1-35
tip_scale = tk.Scale(tip_frame, from_=1, to=35, var=tip_result, orient=tk.HORIZONTAL, length=100)
tip_scale.grid(row=1, column=3, sticky=tk.W)

'''                    
total result display
'''

#label variable
total_cost = tk.IntVar()

result_frame = ttk.Labelframe(app_window, text="Result")
result_frame.grid(row=2, column=3, pady=10, padx=10)

# label for total cost
total_cost = ttk.Label(result_frame, text="Total Cost:")
total_cost.grid(row=1, column=1)

#amount label
total_label = ttk.Label(result_frame, text="---", anchor="center")
total_label.grid(row=2, column=1)


'''                    
calculate button
'''
calc_button = tk.Button(app_window, text="Calculate Cost", command=calc_cost)
calc_button.grid(row=5, column=2)

'''                    
quit button
'''
quit_button = tk.Button(app_window, text="Quit", command=close_window)
quit_button.grid(row=5, column=3)


#wait for user
app_window.mainloop()

另外,我为我自始至终提出的奇怪的 cmets 道歉。我删除了大部分,但是当我做这个的时候我很累,我觉得一切都很有趣。

【问题讨论】:

  • 如果我没记错的话,您可以为您的提示创建一个监听器,然后在值更改时调用某个函数。 stackoverflow.com/questions/3876229/… 可以帮忙
  • 您在dinner_result.get 中忘记了()。我不明白你在((int(tip_result.get()) / 100) * dinner_result) 中试图用dinner_result 做什么——也许你忘记了.get()
  • 当我在控制台/终端中运行代码时,我会看到错误消息。你没看到吗?始终将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图)(不是评论)。还有其他有用的信息。不要期望我们会运行代码来查看您的错误消息。

标签: python user-interface tkinter ttk


【解决方案1】:

当我运行代码时,我会看到错误消息,其中显示问题出在哪里以及问题出在哪里。您应该阅读它并思考这一行有什么问题。您还应该添加此错误消息。

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "<pyshell#1>", line 14, in calc_cost
    before_tax = travel_result.get() + entertainment_result.get() + dinner_result.get + ((int(tip_result.get()) / 100) * dinner_result)
TypeError: unsupported operand type(s) for +: 'int' and 'method'

错误显示行

before_tax = travel_result.get() + entertainment_result.get() + dinner_result.get + ((int(tip_result.get()) / 100) * dinner_result)

在这一行中,您在第一个dinner_result 中忘记了(),在第二个dinner_result 中忘记了.get()

应该是

before_tax = travel_result.get() + entertainment_result.get() + dinner_result.get() + ((int(tip_result.get()) / 100) * dinner_result.get())

现在它显示Restarunt的正确结果


至于按钮Quit - 你在app_window.destroy() 中忘记了()

def close_window():
   app_window.destroy()

【讨论】:

  • 我因为没有早点看到这一点而自责。就像我说的,我对 python 还很陌生,所以我不太擅长解释错误消息。感谢您花时间向我指出这一点。另外,我并不总是明白什么时候使用(),所以这给我带来了很多问题。
  • () 用于运行函数。只有当程序需要稍后运行它时,您才必须使用没有() 的函数名称 - 它被称为callback。在tkinter 中是command=callback.bind(event, callback)root.after(milliseconds, callback)
猜你喜欢
  • 2016-12-09
  • 2015-09-25
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2013-11-24
  • 2015-09-29
相关资源
最近更新 更多