Python进度条选择限制

2024-05-18 13:56:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用带有进度条的Tkinter

下面的代码带有“回调”函数,它为进度条增加了50%。 我想将每个选项菜单选择的功能限制为只工作一次

目前,我可以在第一个选项菜单上单击两次,并在进度栏中达到100%。 有人知道我应该在“callback”函数中更改什么,以便使它在每个选项菜单中只工作一次吗?无论用户单击多少次以更改其选定值

enter image description here

from tkinter import *
from tkinter.ttk import Progressbar

root = Tk()
root.title('Input window V1')
root.geometry('600x400')
root.resizable(False, False)

frame = Frame(root, width=600, height=400)
frame.configure(background="gray28")
frame.pack(fill=BOTH, expand=True)

progress = Progressbar(root, orient=HORIZONTAL, length=300, mode='determinate')
progress.place(x=150, y=15)

Budget = {'Flexible', 'Variable', 'Fixed'}
Commitment = {'High', 'Medium', 'Low'}

def callback(*args):
    progress["value"] += 50

bottom_header = Label(root, bg="gray28", fg="white", pady=3,
                  font=("Helvetica", 20, 'underline'), text='Please fill the following attributes:')
bottom_header.place(x=110, y=100)

lbl1 = Label(root, bg="gray28", text='Budget:', fg="cyan2", font=("Helvetica", 14))
lbl1.place(x=120, y=200)

lbl2 = Label(root, bg="gray28", text='Commitment:', fg="cyan2", font=("Helvetica", 14))
lbl2.place(x=120, y=240)

var1 = StringVar(root)
pl1 = OptionMenu(root, var1, *Budget)
pl1.config(width=20, bg="GREEN", fg="white")
pl1.place(x=250, y=200)

var1.trace("w", callback)

var2 = StringVar(root)
pl2 = OptionMenu(root, var2, *Commitment)
pl2.config(width=20, bg="GREEN", fg="white")
pl2.place(x=250, y=240)

var2.trace("w", callback)

global var_dict

var_dict = dict(Budget=var1,
                Commitment=var2)

button1 = Button(root, text="Test")
button1.config(width=25, bg="white")
button1.place(x=220, y=320)

root.mainloop()

提前谢谢


Tags: text选项callback菜单placerootwidthbg
2条回答

跟踪您已经考虑的两个因素中的哪一个,并且仅当此部分尚未添加50%时才进行更新。 回调函数被更改(并且是可以理解的),回调的传递被更改为lambda函数(如果您从未使用过它们,这可能会造成混淆)

这对我很有用:

from tkinter import *
from tkinter.ttk import Progressbar

root = Tk()
root.title('Input window V1')
root.geometry('600x400')
root.resizable(False, False)

frame = Frame(root, width=600, height=400)
frame.configure(background="gray28")
frame.pack(fill=BOTH, expand=True)

progress = Progressbar(root, orient=HORIZONTAL, length=300, mode='determinate')
progress.place(x=150, y=15)

Budget = {'Flexible', 'Variable', 'Fixed'}
Commitment = {'High', 'Medium', 'Low'}

budgetset = False
commitmentset = False
def callback(nb):
    global budgetset, commitmentset
    if nb == 0 and not budgetset:
        budgetset = True
        progress["value"] += 50
    if nb == 1 and not commitmentset:
        commitmentset = True
        progress["value"] += 50

bottom_header = Label(root, bg="gray28", fg="white", pady=3,
                  font=("Helvetica", 20, 'underline'), text='Please fill the following attributes:')
bottom_header.place(x=110, y=100)

lbl1 = Label(root, bg="gray28", text='Budget:', fg="cyan2", font=("Helvetica", 14))
lbl1.place(x=120, y=200)

lbl2 = Label(root, bg="gray28", text='Commitment:', fg="cyan2", font=("Helvetica", 14))
lbl2.place(x=120, y=240)

var1 = StringVar(root)
pl1 = OptionMenu(root, var1, *Budget)
pl1.config(width=20, bg="GREEN", fg="white")
pl1.place(x=250, y=200)

var1.trace("w", lambda *_, x=0: callback(x))

var2 = StringVar(root)
pl2 = OptionMenu(root, var2, *Commitment)
pl2.config(width=20, bg="GREEN", fg="white")
pl2.place(x=250, y=240)

var2.trace("w", lambda *_, x=1: callback(x))

global var_dict

var_dict = dict(Budget=var1,
                Commitment=var2)

button1 = Button(root, text="Test")
button1.config(width=25, bg="white")
button1.place(x=220, y=320)

root.mainloop()

试试这个:

from tkinter import *
from tkinter.ttk import Progressbar

def callback(*args):
    user_input = (var_1.get(), var_2.get()) # Here you can add even more variables
    value = 100 - 100/len(user_input)*(user_input.count("")+user_input.count("Select option"))
    progress.config(value=value)

root = Tk()

progress = Progressbar(root, orient="horizontal", length=300)
progress.pack()

var_1 = StringVar(root)
var_1.trace("w", callback)

optionmenu_1 = OptionMenu(root, var_1, "Select option", "Option 1", "Option 2")
optionmenu_1.pack()

var_2 = StringVar(root)
var_2.trace("w", callback)

optionmenu_2 = OptionMenu(root, var_2, "Select option", "Option 1", "Option 2")
optionmenu_2.pack()

# You can remove these if you don't like them:
var_1.set("Select option")
var_2.set("Select option")

root.mainloop()

它计算空OptionMenu的数量,并将进度条设置为正确的百分比

相关问题 更多 >

    热门问题