2014-02-16 27 views
1

我正在與pyqt和pyqtgraph的GUI工作。在我的應用程序中,我有10個帶標籤的imageview,我想知道如何將下面的代碼轉換成更加優雅的pythonic方式來處理這些對象。因此,而不是像這樣:字典和pyqt

img1 = pg.ImageView() 
img2 = pg.ImageView() 
img3 = pg.ImageView() 
img4 = pg.ImageView() 
img5 = pg.ImageView() 
img6 = pg.ImageView() 
img7 = pg.ImageView() 
img8 = pg.ImageView() 
img9 = pg.ImageView() 
img10 = pg.ImageView() 


tab_widget = QtGui.QTabWidget() 
tab1 = QtGui.QWidget() 
tab2 = QtGui.QWidget() 
tab3 = QtGui.QWidget() 
tab4 = QtGui.QWidget() 
tab5 = QtGui.QWidget() 
tab6 = QtGui.QWidget() 
tab7 = QtGui.QWidget() 
tab8 = QtGui.QWidget() 
tab9 = QtGui.QWidget() 
tab10 = QtGui.QWidget() 

p1_vertical = QtGui.QVBoxLayout(tab1) 
p2_vertical = QtGui.QVBoxLayout(tab2) 
p3_vertical = QtGui.QVBoxLayout(tab3) 
p4_vertical = QtGui.QVBoxLayout(tab4) 
p5_vertical = QtGui.QVBoxLayout(tab5) 
p6_vertical = QtGui.QVBoxLayout(tab6) 
p7_vertical = QtGui.QVBoxLayout(tab7) 
p8_vertical = QtGui.QVBoxLayout(tab8) 
p9_vertical = QtGui.QVBoxLayout(tab9) 
p10_vertical = QtGui.QVBoxLayout(tab10) 

tab_widget.addTab(tab1, "Grid 1") 
tab_widget.addTab(tab2, "Grid 2") 
tab_widget.addTab(tab3, "Grid 3") 
tab_widget.addTab(tab4, "Grid 4") 
tab_widget.addTab(tab5, "Grid 5") 
tab_widget.addTab(tab6, "Grid 6") 
tab_widget.addTab(tab7, "Grid 7") 
tab_widget.addTab(tab8, "Grid 8") 
tab_widget.addTab(tab9, "Grid 9") 
tab_widget.addTab(tab10, "Grid 10") 

button1 = QtGui.QPushButton("button1") 
p1_vertical.addWidget(img1) 
p2_vertical.addWidget(img2) 
p3_vertical.addWidget(img3) 
p4_vertical.addWidget(img4) 
p5_vertical.addWidget(img5) 
p6_vertical.addWidget(img6) 
p7_vertical.addWidget(img7) 
p8_vertical.addWidget(img8) 
p9_vertical.addWidget(img9) 
p10_vertical.addWidget(img10) 

也許是這樣的:

d = {} 
for i in range(1,10): 
    d["img{0}".format(i)]= pg.ImageView() 

回答

2

創建一個自定義窗口小部件的類,它所有的設置在其__init__

class ImageViewTab(QtGui.QWidget): 
    def __init__(self, parent=None) 
     super(ImageViewTab, self).__init__(parent) 
     layout = QtGui.QVBoxLayout(self) 
     self.imageview = pg.ImageView(self) 
     layout.addWidget(self.imageview) 

然後添加窗口小部件的實例的標籤-widget in a loop:

tab_widget = QtGui.QTabWidget() 
    for index in range(1, 11): 
     widget = ImageViewTab(tab_widget) 
     tab_widget.addTab(widget, 'Grid %s' % index) 

在完成所有設置後,您可以使用QTabWidget.widget方法的訪問部件通過索引:

widget = tab_widget.widget(4) 
    widget.imageview.setImage(img) 

這種方法的主要好處是,它是非常靈活的。您可以添加專門的方法到您的自定義類,創建併發出自定義信號,添加插槽等。

2
imgs = [pg.ImageView() for _ in range(10)] 

tab_widget = QtGui.QTabWidget() 

tabs = [QtGui.QWidget() for _ in range(10)] 

p_verticals = [QtGui.QVBoxLayout(tab) for tab in tabs] 

for n, tab in enumerate(tabs): 
    tab_widget.addTab(tab, "Grid {0}".format(n+1)) 

button1 = QtGui.QPushButton("button1") 

for p, img in zip(p_verticals, imgs): 
    p.addWidget(img) 

我不明白你爲什麼會想使用字典,列出的罰款。

1

您可以在列表中創建所有的變量:

imgs = [pg.ImageView() for _ in range(10)] 
    tab_widget = QtGui.QTabWidget() 
    tabs = [QtGui.QWidget() for _ in range(10)] 
    p_verticals = [QtGui.QVBoxLayout(tabs[i]) for i in range(10)] 
    for i in range(10): 
     tab_widget.addTab(tab[i], "Grid %d" % i+1) 
     p_verticals[i].addWidget(imgs[i]) 
    button1 = QtGui.QPushButton("button1")