功能运行时不确定进度条

时间:2018-05-25 09:56:09

标签: python python-3.x tkinter

我有一个GUI,它有两个按钮,一个进度条堆叠在一个列上。每个按钮调用一个不同的功能,需要一些时间来执行。当有人点击两个按钮中的任何一个并继续移动(不确定)直到该功能完成然后停止时,我希望进度条移动。我知道我需要使用多线程,但我似乎无法正确使用代码!

代码

from tkinter import Tk
import time 
from tkinter import *
from tkinter import Button
from tkinter import Frame
from tkinter import ttk
import threading


def sample_function():
    time.sleep(2)  # SAMPLE FUNCTION BEING CALLED

def prepare_clicked():
    sample_function()  

def social_clicked():

    sample_function()

def anomaly_clicked():
    sample_function()             



window = Toplevel() # Tried using Tk but I am using image to design each buttons through the button config in my actual code and tk throws error
topFrame = Frame(window)
topFrame.pack()

prepare_btn = Button(topFrame, command=prepare_clicked,text='Button1')
anomaly_btn = Button(topFrame,command=anomaly_clicked,text='Button2')
social_btn = Button(topFrame, command=social_clicked,text='Button3')
processing_bar = ttk.Progressbar(topFrame, orient='horizontal', mode='indeterminate')



window.rowconfigure((0,1), weight=1)  # make buttons stretch when
window.columnconfigure((0,3), weight=1)  # when window is resized
prepare_btn.grid(row=0, column=1, columnspan=1, sticky='EWNS')
anomaly_btn.grid(row=1, column=1, columnspan=1, sticky='EWNS')
social_btn.grid(row=2, column=1, columnspan=1, sticky='EWNS')
processing_bar.grid(row=3, column=1, columnspan=1, sticky='EWNS')


window.mainloop()

1 个答案:

答案 0 :(得分:1)

我已经为您的代码添加了线程。我假设您在功能正在进行时不希望任何按钮可按下。如果您不需要,只需删除更改for的{​​{1}}中的run_function个圈。我还修了一行&列配置代码,以便小部件扩展&用户调整窗口大小时收缩。我摆脱了evil "star" import

btn['state']

<强>更新

这是新的改进版本,其中包含全部&#39;按顺序运行所有功能的按钮。享受!

import tkinter as tk
from tkinter import ttk
import time
from threading import Thread

def sample_function():
    time.sleep(2)

def run_function(name, func):
    # Disable all buttons
    for btn in buttons:
        btn['state'] = 'disabled'

    processing_bar.start(interval=10)
    print(name, 'started')
    func()
    processing_bar.stop()
    print(name, 'stopped')

    # Enable all buttons
    for btn in buttons:
        btn['state'] = 'normal'

def run_thread(name, func):
    Thread(target=run_function, args=(name, func)).start()

def prepare_clicked():
    run_thread('prepare', sample_function)

def social_clicked():
    run_thread('social', sample_function)

def anomaly_clicked():
    run_thread('anomaly', sample_function)


window = tk.Tk()
#window = tk.Toplevel()

topFrame = tk.Frame(window)

# Tell the Frame to fill the whole window
topFrame.pack(fill=tk.BOTH, expand=1)

# Make the Frame grid contents expand & contract with the window
topFrame.columnconfigure(0, weight=1)
for i in range(4):
    topFrame.rowconfigure(i, weight=1)

prepare_btn = tk.Button(topFrame, command=prepare_clicked, text='Button1')
anomaly_btn = tk.Button(topFrame,command=anomaly_clicked, text='Button2')
social_btn = tk.Button(topFrame, command=social_clicked, text='Button3')
buttons = [prepare_btn, anomaly_btn, social_btn]

processing_bar = ttk.Progressbar(topFrame, orient='horizontal', mode='indeterminate')

prepare_btn.grid(row=0, column=0, columnspan=1, sticky='EWNS')
anomaly_btn.grid(row=1, column=0, columnspan=1, sticky='EWNS')
social_btn.grid(row=2, column=0, columnspan=1, sticky='EWNS')
processing_bar.grid(row=3, column=0, columnspan=1, sticky='EWNS')

window.mainloop()