【问题标题】:Python: What is wrong with this simple calculationPython:这个简单的计算有什么问题
【发布时间】:2021-05-13 13:43:09
【问题描述】:

我不明白如何解决计算中发生的问题。

我的代码中有一个变量val_var。我希望val_var 的值等于其他 2 个变量的总和:

imp_var = StringVar(value=0)man_var = StringVar(value=0)

(请注意完整代码中用户选择了不同的值,0 只是在进行任何选择之前的默认值)

在 gui 中,用户定义了一项任务和一些值(“影响”和“可管理性”)。 我想要这些值的总和。

我已经定义了 val_var = str(imp_var)+str(man_var) 最终打印出 00 并且还尝试了val_var = (imp_var)+(man_var),它也会打印 00

编辑:

我已经定义了val_var = int(imp_var.get())+ int(man_var.get()),但是当我尝试打印它时它仍然打印0

在代码中打印: 第 26 行

代码中的imp_var: 第 49 行

代码中的man_var: 第 54 行

代码中的val_var: 第65行

完整代码:

import tkinter.messagebox # Import the messagebox module



task_list = []
task_types = ['Sparetime', 'School', 'Work']

class Task:
    def __init__(self, n, i, m, h, v): 
        self.name = n
        self.impact = i
        self.manageability = m
        self.hours = h
        self.value = v


def show_tasks():
    task = task_list[-1]
    #print(
        #'Task:'+task.name + '\n' +
        #'Impact:' + task.impact + '\n' +
        #'Manageability:' + task.manageability + '\n' +
        #'Hours:' + task.hours + '\n'
        #'Value:' + task.value +'\n'
        #)
    print('Task:')
    print(task.name)
    print('Impact:')
    print(task.impact)
    print('manageability:')
    print(task.manageability)
    print('Hours')
    print(task.hours)
    print('Value:')
    print(task.value)

def open_add_task():
    taskwin = Toplevel(root)
    taskwin.focus_force()
    
    #TITLE
    titlelabel = Label(taskwin, text='Title task concisely:', font=('Roboto',11,'bold')).grid(column=1, row=0)
    name_entry = Entry(taskwin, width=40, justify='center')
    name_entry.grid(column=1, row=1)

    #IMPACT
    impactlabel = Label(taskwin, text='Impact', font=('Roboto',10)).grid(column=0, row=2)
    imp_var = StringVar(value=0)
    OptionMenu(taskwin, imp_var, *range(0, 10+1)).grid(column=0, row=3, sticky='ns')

    #MANAGEABILITY
    manlabel = Label(taskwin, text='Manageability', font=('Roboto',10)).grid(column=1, row=2)
    man_var = StringVar(value=0)
    OptionMenu(taskwin, man_var, *range(0, 10+1)).grid(column=1, row=3, sticky='nsew')



    #HOURS(required)
    hourlabel = Label(taskwin, text='Whole hours \n required', font=('Roboto',10)).grid(column=1, row=16)
    hour_entry = Entry(taskwin, width=4, justify='center')
    hour_entry.grid(column=1, row=17)

    #VALUE
    val_var = int(imp_var.get())+ int(man_var.get())
        
    def add_task():
        if name_entry.get() != '': # If textbox inputfield is NOT empty do this:
            task_list.append(Task(name_entry.get(), imp_var.get(), man_var.get(), hour_entry.get(), val_var))
            show_tasks()
            listbox_tasks.insert(tkinter.END, name_entry.get())
            name_entry.delete(0, tkinter.END)
            taskwin.destroy()
        else:
            tkinter.messagebox.showwarning(title='Whoops', message='You must enter a task')

        
    next_button = Button(taskwin, text='Next', font=('Roboto',10), command=add_task).grid(column=2, row=18, sticky="ne")
    
def sort_tasks():
    pass
def delete_task():
    try:
        task_index = listbox_tasks.curselection()[0]
        listbox_tasks.delete(task_index)
    except:
        tkinter.messagebox.showwarning(title='Error', message='You must select a task to delete')

def save_tasks():
    pass

    


    
    
    
    

root = Tk()








task_frame = Frame()
# Create UI
your_tasks_label = Label(root, text='THESE ARE YOUR TASKS:', font=('Roboto',10, 'bold'), justify='center')
your_tasks_label.pack()


scrollbar_tasks = tkinter.Scrollbar(root)
scrollbar_tasks.pack(side=tkinter.RIGHT, fill=tkinter.Y)

listbox_tasks = tkinter.Listbox(root, height=10, width=50, font=('Roboto',10), justify='center') # tkinter.Listbox(where it should go, height=x, width=xx)
listbox_tasks.pack()

listbox_tasks.config(yscrollcommand=scrollbar_tasks.set)
scrollbar_tasks.config(command=listbox_tasks.yview)


#BUTTONS
Add_Button = Button(root, text='Add New', width=42, command=open_add_task)
Add_Button.pack()

button_delete_task = Button(root, text='Delete task', width=42, command=delete_task)
button_delete_task.pack()


button_save_tasks = Button(root, text='Save tasks', width=42, command=save_tasks)
button_save_tasks.pack()

root.mainloop()

【问题讨论】:

  • 你试过用int()代替str()吗?
  • 是的,它返回错误TypeError: can only concatenate str (not "int") to str

标签: python-3.x tkinter calculation tkinter-entry


【解决方案1】:

+ 运算符在应用于字符串时是字符串连接(连接)。当应用于数字时,它是加法。

所以"4" + "2" 给出"42"4 + 2 给出6

所以,如果你想加法,你需要把你的字符串变成数字。 Python 有一个函数可以为你做到这一点,例如:

num1 = "4"
num2 = "2"
print(num1 + num2)           # outputs 42.
print(int(num1) + int(num2)) # outputs 6.

【讨论】:

  • 我已经尝试过val_var = (int(imp_var.get()))+ (int(man_var.get())),但出现错误:TypeError: can only concatenate str (not "int") to str
  • @KarimLoberg:不可能从该注释中的代码中得到该错误,因为添加的内容都是数字,而不是字符串。由于您原始代码中的行还添加了hour_entry.get(),因此您可能需要确保也将其设为数字​​。
  • 我找到了原因,这是因为我试图在代码的其他地方打印一个字符串 + val_var。我已更正并更新了我的问题中的代码,但它只返回 0
猜你喜欢
  • 1970-01-01
  • 2012-06-30
  • 2013-05-31
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多