【发布时间】:2019-01-23 20:02:36
【问题描述】:
为什么这段代码会失败
我试图在按下设置按钮时召唤一个允许用户更改前景和背景颜色的窗口
我得到了单选按钮,但每次我提交颜色时都会收到一个错误,即使它们的值不是 0
我该如何解决这个问题?为什么会这样?
from tkinter import *
import os
from tkinter import messagebox as mgb
import tkinter.ttk as tk2
global colour_1, colour_2
colour_1 = "pink"
colour_2 = "purple" #background
def sayclick() :
btn.configure(text = "saying")
text = txt.get()
os.system("""PowerShell -Command "Add-Type –AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak('""" + text + """ ');" """)
btn.configure(text = "say")
def colourmenu():
window = Tk()
window.title("colour menu")
selected = IntVar()
selected2 = IntVar()
rad11 = tk2.Radiobutton(window,text='blue ', value=1, variable=selected)# set 1
rad21 = tk2.Radiobutton(window,text='green', value=2, variable=selected)#
rad31 = tk2.Radiobutton(window,text='red ', value=3, variable=selected)#
rad41 = tk2.Radiobutton(window,text='black', value=4, variable=selected)#
rad12 = tk2.Radiobutton(window,text='blue ', value=1, variable=selected2)
rad22 = tk2.Radiobutton(window,text='green', value=2, variable=selected2)
rad32 = tk2.Radiobutton(window,text='red ', value=3, variable=selected2)
rad42 = tk2.Radiobutton(window,text='black', value=4, variable=selected2)
def submitbut():
if selected.get() == 0 :
mgb.showinfo("error", "error: invalid colour choise")
elif selected2.get() == 0 :
mgb.showinfo("error", "error: invalid colour choise")
else :
for n in range(1,3):
if n == 1 :
val = selected.get()
rep = 1
else :
val = selected2.get()
rep = 2
if val == 1:
colour = "blue"
elif val == 2 :
colour = "green"
elif val == 3 :
colour = "red"
else :
colour = "black"
if rep == 1 :
bg = colour
else :
fg = colour
submit = Button(window, text="submit", command=submitbut)
txt1 = Label(window, text = "background")
txt1.grid(column = 0, row = 0)
txt2 = Label(window, text = "forground")
txt2.grid(column = 1, row = 0)
rad11.grid(column=0, row=1)#set 1
rad21.grid(column=0, row=2)#
rad31.grid(column=0, row=3)#
rad41.grid(column=0, row=4)#
rad12.grid(column=1, row=1)
rad22.grid(column=1, row=2)
rad32.grid(column=1, row=3)
rad42.grid(column=1, row=4)
submit.grid(column=0, row=5)
window.mainloop()
root = Tk()
root.geometry("170x120")
root.title("tts entry box")
root.configure(background = colour_2)
lab = Label(root, text = "enter text and than press\n\"say\" to say the text", font = ("Arial Bold", 10), fg = colour_2, bg = colour_1)
lab.grid(column = 0, row = 0)
btn = Button(root, text = " say. ", font = ("Arial", 8), bg = colour_1, fg = colour_2, command = sayclick)
btn.grid(column = 0, row = 3)
btn2 = Button(root, text = "settings", font = ("Arial", 8), bg = colour_1, fg = colour_2, command = colourmenu)
btn2.grid(column = 0, row = 4)
txt = Entry(root, width = 10, bg = colour_1, fg = colour_2)
txt.grid(column = 0, row = 2)
root.mainloop()
【问题讨论】:
-
我应该使用另一种输入方法
-
你遇到了什么错误?
-
我注意到,如果我删除从
root = Tk()到root.mainloop()的所有内容并将其替换为colourmenu(),那么selected.get()和selected2.get()将返回正确的值。也许与此有关?例如,我不确定您是否应该多次致电mainloop。 -
@Kevin 您可以在
mainloop中执行mainloop— 这通常不是一个好主意,但不会导致这里出现问题。您甚至可以创建多个独立的根实例,在一个根上调用mainloop确实意味着另一个根及其所有后代在完成之前都没有响应。 (这曾经是在 Classic Mac、Win16 和 Motif 中伪造模态对话框的一种 hacky 但偶尔有用的方法,但它在大多数现代系统中没有用……但无论如何,OP 并没有注意到这个问题。) -
为什么人们总是对我投反对票?
标签: python windows user-interface tkinter radio-button