PyQt用table打开一个子窗口(图灵机App)
PyQt open a subwindow with table (turing machine App)
我想创建一个带有按钮 "ruban"
的 window,当我单击此按钮时,它会打开一个新的 window,其中 table 包含 "data"
。
我的问题是当我 运行 它,我点击按钮它没有出现任何东西....
非常感谢您的帮助!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
data = {'col1':['1','2','3'], 'col2':['4','5','6'], 'col3':['7','8','9']}
class Window (QtGui.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.setGeometry(100, 100, 500, 300)
self.setWindowTitle("Machine de Turing")
#self.setWindowIcon(QtGui.QIcon('logo.png'))
self.home()
def home(self):
btn1 = QtGui.QPushButton("Ruban", self)
btn1.clicked.connect(self.edit_ruban)
btn1.resize(btn1.sizeHint())
self.show()
def edit_ruban(self):
table = MyTable(self, data, 5, 3)
table.show()
class MyTable(QTableWidget):
def __init__(self, data, *args):
QTableWidget.__init__(self, *args)
self.data = data
self.setmydata()
self.resizeColumnsToContents()
self.resizeRowsToContents()
def setmydata(self):
horHeaders = []
for n, key in enumerate(sorted(self.data.keys())):
horHeaders.append(key)
for m, item in enumerate(self.data[key]):
newitem = QTableWidgetItem(item)
self.setItem(m, n, newitem)
self.setHorizontalHeaderLabels(horHeaders)
def run():
app = QtGui.QApplication(sys.argv)
GUI=Window()
sys.exit(app.exec_())
run()
您在调用 MyTable.__init__
时使用了错误的参数。
不清楚为什么要添加 self
作为第一个参数。
Python 提供了隐含的 self
所以它是 data
必须先行。
如果您打算为 MyTable 提供父级 window,它必须放在最后,
看签名 QTableWidget::QTableWidget ( int rows, int columns, QWidget * parent = 0 )
,
所以电话会像这样:
table = MyTable(data, 5, 3, self)
但是 MyTable
默认情况下会嵌入到 Window
显然这不是你想要的。
为避免嵌入省略 parent
参数并保存对新创建的 table
的引用
def edit_ruban(self):
table = MyTable(data, 5, 3) # no parent provided
table.show()
self.table = table # this prevents the garbage collector
# from deleting the new table
或更好地将 window 标志设置为 Qt.Window
def edit_ruban(self):
table = MyTable(data, 5, 3, self)
# add Qt.Window to table's flags
table.setWindowFlags(table.windowFlags() | Qt.Window)
table.show()
我想创建一个带有按钮 "ruban"
的 window,当我单击此按钮时,它会打开一个新的 window,其中 table 包含 "data"
。
我的问题是当我 运行 它,我点击按钮它没有出现任何东西....
非常感谢您的帮助!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
data = {'col1':['1','2','3'], 'col2':['4','5','6'], 'col3':['7','8','9']}
class Window (QtGui.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.setGeometry(100, 100, 500, 300)
self.setWindowTitle("Machine de Turing")
#self.setWindowIcon(QtGui.QIcon('logo.png'))
self.home()
def home(self):
btn1 = QtGui.QPushButton("Ruban", self)
btn1.clicked.connect(self.edit_ruban)
btn1.resize(btn1.sizeHint())
self.show()
def edit_ruban(self):
table = MyTable(self, data, 5, 3)
table.show()
class MyTable(QTableWidget):
def __init__(self, data, *args):
QTableWidget.__init__(self, *args)
self.data = data
self.setmydata()
self.resizeColumnsToContents()
self.resizeRowsToContents()
def setmydata(self):
horHeaders = []
for n, key in enumerate(sorted(self.data.keys())):
horHeaders.append(key)
for m, item in enumerate(self.data[key]):
newitem = QTableWidgetItem(item)
self.setItem(m, n, newitem)
self.setHorizontalHeaderLabels(horHeaders)
def run():
app = QtGui.QApplication(sys.argv)
GUI=Window()
sys.exit(app.exec_())
run()
您在调用 MyTable.__init__
时使用了错误的参数。
不清楚为什么要添加 self
作为第一个参数。
Python 提供了隐含的 self
所以它是 data
必须先行。
如果您打算为 MyTable 提供父级 window,它必须放在最后,
看签名 QTableWidget::QTableWidget ( int rows, int columns, QWidget * parent = 0 )
,
所以电话会像这样:
table = MyTable(data, 5, 3, self)
但是 MyTable
默认情况下会嵌入到 Window
显然这不是你想要的。
为避免嵌入省略 parent
参数并保存对新创建的 table
def edit_ruban(self):
table = MyTable(data, 5, 3) # no parent provided
table.show()
self.table = table # this prevents the garbage collector
# from deleting the new table
或更好地将 window 标志设置为 Qt.Window
def edit_ruban(self):
table = MyTable(data, 5, 3, self)
# add Qt.Window to table's flags
table.setWindowFlags(table.windowFlags() | Qt.Window)
table.show()