首先,每次按下按钮并选择一个选项,我都会收到错误:
TypeError:&:'NoneType'和'NoneType'不支持的操作数类型。
但它确实应该做的事情。这是一个问题吗?
其次,我希望'Current_list_var'标签中的文本包含来自'冠军列表'的项目。然后,当我按下按钮并选择一个选项时,列表中的下一个项目应出现在标签上。
我怎么能这样做?
import tkinter as tk
from tkinter import ttk
import tkinter.messagebox
TITLE_FONT = ("Helvetica", 18, "bold")
root = tk.Tk()
root.minsize(500, 400)
titel = tk.StringVar()
score_Dennis = tk.IntVar()
score_Jawa = tk.IntVar()
titel_score_var = tk.IntVar()
list_var = tk.IntVar()
counter_var = tk.IntVar()
champvar = tk.StringVar()
listvar = tk.IntVar()
# Frames
mainframe=tk.Frame(root).pack()
titel_frame = tk.Frame(mainframe)
titel_frame.pack()
score_frame = tk.Frame(mainframe)
score_frame.pack()
# Init
titel.set("")
if score_Jawa == 0:
score_Jawa.set(score_Jawa)
if score_Dennis == 0:
score_Dennis.set(score_Dennis)
champion_list = ['SomeItem', 'AnotherItem', 'AndAnotherItem']
# Functions
def popup():
tkinter.messagebox.showinfo('Info', 'popup')
def titel_check():
if score_Dennis.get() == score_Jawa.get():
titel.set('Het staat gelijk!')
titel_score_var.set('start een match')
elif score_Jawa.get() > score_Dennis.get():
titel.set("Jawa staat voor met: ")
titel_score_var.set(score_Jawa.get() - score_Dennis.get())
else:
titel.set("Dennis staat voor met: ")
titel_score_var.set(score_Dennis.get() - score_Jawa.get())
def Dennis_plus():
score_Dennis.set(score_Dennis.get() +1)
titel_check()
counter_var.set(score_Dennis.get() + score_Jawa.get())
return
def Jawa_plus():
score_Jawa.set(score_Jawa.get() + 1)
titel_check()
counter_var.set(score_Dennis.get() + score_Jawa.get())
return
def nieuwe_match():
x = champion_list
top = tk.Toplevel()
global listvar
top.title("Uitslag")
top.minsize(100, 80)
msg = tk.Message(top, text="Who won?")
msg.pack()
button_Jawa = tk.Button(top, text="Jawa", command=lambda:Jawa_plus() & top.destroy())
button_Jawa.pack(side=tk.LEFT, pady=15, padx=10)
button_Dennis = tk.Button(top, text="Dennis", command=lambda:Dennis_plus() & top.destroy())
button_Dennis.pack(side=tk.RIGHT, pady=15, padx=10)
return
# Layout
titel_label = tk.Label(titel_frame, textvariable=titel, font=TITLE_FONT)
titel_label.grid(row=0, column=0)
huidige_champ = tk.Label(score_frame, text="De gespeelde Champ is:", font=TITLE_FONT)
huidige_champ.grid(row=5, column=0)
current_list_var = tk.Label(score_frame, text=champvar.get(), font=TITLE_FONT) # the list variable
current_list_var.grid(row=5, column=1)
titel_score = tk.Label(titel_frame, textvariable=titel_score_var, font=TITLE_FONT)
titel_score.grid(row=0, column=1)
score_Dennis_label_text = tk.Label(score_frame, text="Dennis: ", font=TITLE_FONT).grid(row=1, column=1)
score_Dennis_label = tk.Label(score_frame, textvariable=score_Dennis, font=TITLE_FONT)
score_Dennis_label.grid(row=1, column=2,sticky=tk.W)
score_Jawa_label_text=tk.Label(score_frame, text="Jawa: ", font=TITLE_FONT).grid(row=1, column=3)
score_Jawa_label = tk.Label(score_frame, textvariable=score_Jawa, font=TITLE_FONT)
score_Jawa_label.grid(row=1, column=4)
next_match = ttk.Button(score_frame, command=nieuwe_match, text="Match gespeeld").grid(row=2, column=2)
totaal_score_label_text = tk.Label(score_frame, text="Aantal gespeelde matches", font=TITLE_FONT).grid(row=4, column=0)
totaal_score_label = tk.Label(score_frame, textvariable=counter_var, font=TITLE_FONT).grid(row=4, column=2)
root.mainloop()
答案 0 :(得分:0)
由于您在TypeError: unsupported operand type(s) for &: 'NoneType' and 'NoneType'
和button_Jawa
内的lambda函数,发生了第一个错误button_Dennis
。
lambda的语法是:lambda <args>: <expression>
,
其中表达式必须是单个表达式,而不是由分号,符号或其他任何东西分隔的多个表达式!
所以这是一个技巧(糟糕的技巧,所以我建议你编写包含两个函数的新函数):
# try to pass your functions as a list (:
button_Jawa = tk.Button(top, text="Jawa", command=lambda: [Jawa_plus(), top.destroy()])
button_Dennis = tk.Button(top, text="Dennis", command=lambda: [Dennis_plus(), top.destroy()])
您的第二个问题 - 您错误地使用了champvar
- 变量。要将StringVar
绑定到Label
窗口小部件,请使用textvariable
参数而不是简单的text
,如下所示:
current_list_var = tk.Label(score_frame, textvariable=champvar, font=TITLE_FONT) # the list variable
但在这种情况下,要更新champvar
,您还需要更新lambda函数!所以最终的lambdas看起来像那样:
button_Jawa = tk.Button(top, text="Jawa", command=lambda: [Jawa_plus(), top.destroy(), champvar.set("Jawa")])
button_Dennis = tk.Button(top, text="Dennis", command=lambda: [Dennis_plus(), top.destroy(), champvar.set("Dennis")])
在这里,我展示了如何将champvar更改为Dennis / Java,如何将champvar更改为列表中的项目 - 我将此任务留给您。我认为通过编写一个单独的函数而不是lambda,你将处理这个任务。
说实话 - 你需要一个班级来存储你所有的变量! 如果你真的想要它没有类和全局列表 - 你需要另一个变量来循环列表!
这样的事情:
from itertools import cycle
listing = ['ok1', 'ok2', 'blablabla', 'okagain']
listing2 = ['cat', 'dog', 'crocodile']
def loop_over(iterable=None, change=False):
# smth like static variable
if (not hasattr(loop_over, 'pool') or change) and iterable is not None:
loop_over.pool = cycle(iterable)
if not change and hasattr(loop_over, 'pool'):
return next(loop_over.pool)
def main():
# set new list to cycle
loop_over(listing, True)
# loop over
for i in range(0, 5):
print(loop_over())
# set another list to cycle
loop_over(listing2, True)
# loop over
for i in range(0, 5):
print(loop_over())
main()
或更直:
from itertools import cycle
pool = cycle(['cat', 'dog', 'crocodile'])
for i in range(0, 5):
print(next(pool))
<强>摘要强>:
lambda
,只需将你的功能放到另一个! lambda
作为命令参数只有一个原因 - 如果你想要传递参数和函数本身。