問題描述
我正在 kivy 中制作一個應用程序,因為我正在使用 linux.我在使用 python-kivy 中的多線程時鐘對象更新進度條 gui 時遇到問題.我正在使用這兩個文件 .kv &.py 文件運行應用程序.
I am making an app in kivy for that i am using linux. i am getting a problem to update the progress bar gui using clock object with multithreading in python-kivy. i am using both files .kv & .py file run the app.
我的 main.py 文件:
my main.py file:
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.progressbar import ProgressBar
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.clock import Clock
import sys, threading, os, time
from socket import *
class Out_Come(BoxLayout):
def Input_manager(self, *args):
try:
t = self.ids.nd.text
I=socket.gethostbyname(t)
st = self.ids.ti.text
et = self.ids.it.text
st1=int(st)
et1=int(et)
while st1<=et1:
work=my_function(I,st1)
work.start()
Clock.schedule_once(lambda dt: work.run, 1)
st1=st1+1
self.ids.pb.value=self.ids.pb.value+1
except:
"Error"
class my_function(threading.Thread):
def __init__(self,n, d):
threading.Thread.__init__(self)
self.n = n
self.d = d
def run(self):
try:
get = socket(AF_INET, SOCK_STREAM)
get.settimeout(4)
get.connect((gethostbyname(self.n), int(self.d)))
print"done", self.d
get.close()
except:
print"not done", self.d
class Example_app(App):
def build(self):
return Out_Come()
if __name__ == '__main__':
Example_app().run()
我的 .kv 文件:
<Out_Come>:
GridLayout:
orientation:'vertical'
rows:2
cols:2
padding:10
spacing:10
Label:
text:"[b]Enter value:[b]"
markup:True
size_hint:.3,.3
TextInput:
id:nd
text: ""
height:40
multiline:False
GridLayout:
orientation: 'vertical'
rows:2
cols:4
padding:10
spacing:10
Label:
text:"[b]First:[b]"
height:40
size_hint:.25,.25
markup:True
TextInput:
id:ti
text:""
height: 40
size_hint:.25,.25
multiline:False
Label:
text:"[b]last[b]"
height:40
size_hint:.25,.25
markup:True
TextInput:
id:it
text:""
height:40
size_hint:.25,.25
multiline:False
GridLayout:
orientation: 'vertical'
rows:1
cols:2
padding:10
spacing:10
Button:
id:get
text:'Start'
size_hint:.3,.3
on_press: root.Input_manager()
ProgressBar:
id:pb
max:100
value:0
進度條是否完美更新?我想在實時更新它.請告訴我執行此代碼的更好方法.提前致謝.
Is the progress bar perfectly updating? i want upate it prefectly in live time. Please tell me the better way to execute this code. Thanks in advance.
推薦答案
你的代碼有幾個問題:
您的 UI 線程中有一個循環(這將停止 UI 更新)
You have a loop in your UI thread (which will stop the UI updating)
while st1<=et1:
work=my_function(I,st1)
work.start()
Clock.schedule_once(lambda dt: work.run, 1)
st1=st1+1
self.ids.pb.value=self.ids.pb.value+1
您需要像這樣將循環傳遞到您的線程中:
You need to pass the loop into your thread like this:
...
def Input_manager(self, *args):
...
st1=int(st)
et1=int(et)
work=my_function(I,st1, est1,
#sending a thread safe update progress bar function
lambda : Clock.schedule_once(self.update_bar))
work.start()
def update_bar(self, dt=None):
self.ids.pb.value=self.ids.pb.value+1
class my_function(threading.Thread):
def __init__(self,n, st, et, update_bar):
threading.Thread.__init__(self)
self.n = n
self.st = st
self.et = et
self.update_bar = update_bar
def run(self):
for din range(self.st1, self.et1+1):
try:
get = socket(AF_INET, SOCK_STREAM)
get.settimeout(4)
get.connect((gethostbyname(self.n), int(d)))
print"done", d
get.close()
except:
print"not done", d
finally:
self.update_bar() #this is our callback to update the bar!
還有更多的修復需要完成(風格方面),但這超出了上下文
There are more fixes to be done (style wise) but that is outside the context
注意 - 這未經任何測試...
Note - this was not tested by any means...
這篇關于如何在 kivy-python 中使用具有多線程的時鐘對象更新進度條?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!