如何从 Python 中的 Main class 调用 GUI 函数?
How do I call an GUI function from Main class in Python?
我需要 my_app 中的 ProgressBar
小部件,当我点击 pushButton
时,我无法在 def download (self)
中调用 def call_progressBar2(self,value1)
。
谁能帮帮我?
main.py
from g import Ui_MainWindow
from PyQt4 import QtCore, QtGui
import sys
import time
from b import classb
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
instance_b=classb()
tvt= self.call_progressBar2(self)
QtCore.QObject.connect(self.ui.pushButton1, QtCore.SIGNAL("clicked()"), \
lambda: instance_b.download(tvt))## I need help here.
def call_progressBar2(self,value1):
while True:
time.sleep(0.05)
value = self.ui.progressBar.value() + 1
self.ui.progressBar.setValue(value)
QtGui.qApp.processEvents()
if (not self.ui._active or
value >= self.progressBar.maximum()):
if value==value1:
break
self.ui._active = False
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
b.py
import time
from PyQt4 import QtCore, QtGui
class classb (object):
def __init__(self, parent=None):
self.parent=parent
#I need call def call_progressBar2() here.
def download(self):
from main import MainWindow
instance_m= MainWindow
print 'a'
instance_m.call_progressBar2(20)
print 'b'
instance_m.call_progressBar2(40)
print 'c'
instance_m.call_progressBar2(60)
print 'd'
instance_m.call_progressBar2(100)
为什么不在连接信号时将当前 MainWindow
实例传递给 download
函数?或者在连接信号之前实例化它时将它传递给 classb
初始化程序?或者指定 download
以便它接受回调,并在连接信号时将 MainWindow
当前实例的 call_progressBar2
方法作为回调传递 ?
不是在 classb.download
方法中创建 MainWindow
的实例,而是在连接信号时将其作为参数传递,这样:
#tvt= self.call_progressBar2(self) #No need for tvt
QtCore.QObject.connect(self.ui.pushButton1, QtCore.SIGNAL("clicked()"), \
lambda: instance_b.download(self)) #self here is the MainWindow Instance
然后在classb.download
方法中:
def download(self, main_window):
print 'a'
main_window.call_progressBar2(20)
print 'b'
main_window.call_progressBar2(40)
print 'c'
main_window.call_progressBar2(60)
print 'd'
main_window.call_progressBar2(100)
我需要 my_app 中的 ProgressBar
小部件,当我点击 pushButton
时,我无法在 def download (self)
中调用 def call_progressBar2(self,value1)
。
谁能帮帮我?
main.py
from g import Ui_MainWindow
from PyQt4 import QtCore, QtGui
import sys
import time
from b import classb
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
instance_b=classb()
tvt= self.call_progressBar2(self)
QtCore.QObject.connect(self.ui.pushButton1, QtCore.SIGNAL("clicked()"), \
lambda: instance_b.download(tvt))## I need help here.
def call_progressBar2(self,value1):
while True:
time.sleep(0.05)
value = self.ui.progressBar.value() + 1
self.ui.progressBar.setValue(value)
QtGui.qApp.processEvents()
if (not self.ui._active or
value >= self.progressBar.maximum()):
if value==value1:
break
self.ui._active = False
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
b.py
import time
from PyQt4 import QtCore, QtGui
class classb (object):
def __init__(self, parent=None):
self.parent=parent
#I need call def call_progressBar2() here.
def download(self):
from main import MainWindow
instance_m= MainWindow
print 'a'
instance_m.call_progressBar2(20)
print 'b'
instance_m.call_progressBar2(40)
print 'c'
instance_m.call_progressBar2(60)
print 'd'
instance_m.call_progressBar2(100)
为什么不在连接信号时将当前 MainWindow
实例传递给 download
函数?或者在连接信号之前实例化它时将它传递给 classb
初始化程序?或者指定 download
以便它接受回调,并在连接信号时将 MainWindow
当前实例的 call_progressBar2
方法作为回调传递 ?
不是在 classb.download
方法中创建 MainWindow
的实例,而是在连接信号时将其作为参数传递,这样:
#tvt= self.call_progressBar2(self) #No need for tvt
QtCore.QObject.connect(self.ui.pushButton1, QtCore.SIGNAL("clicked()"), \
lambda: instance_b.download(self)) #self here is the MainWindow Instance
然后在classb.download
方法中:
def download(self, main_window):
print 'a'
main_window.call_progressBar2(20)
print 'b'
main_window.call_progressBar2(40)
print 'c'
main_window.call_progressBar2(60)
print 'd'
main_window.call_progressBar2(100)