我有一個在 QT Designer 中設計的 PyQT UI,有 40 個圖形(在不同的選項卡上),以及對 UI 中元素的一堆重復參考。例如,以下唯一的文本欄位,用于設定每個圖形的標題。
# Tab 1
self.tab1_tl1.canvas.axes.set_title(self.tab1_tl1_title.text())
self.tab1_tl2.canvas.axes.set_title(self.tab1_tl2_title.text())
self.tab1_tl3.canvas.axes.set_title(self.tab1_tl3_title.text())
self.tab1_tl4.canvas.axes.set_title(self.tab1_tl4_title.text())
self.tab1_tl1.canvas.axes.set_ylabel(self.tab1_tl1_ylabel.text())
self.tab1_tl2.canvas.axes.set_ylabel(self.tab1_tl2_ylabel.text())
self.tab1_tl3.canvas.axes.set_ylabel(self.tab1_tl3_ylabel.text())
self.tab1_tl4.canvas.axes.set_ylabel(self.tab1_tl4_ylabel.text())
# Tab 2
self.tab2_tl1.canvas.axes.set_title(self.tab2_tl1_title.text())
self.tab2_tl2.canvas.axes.set_title(self.tab2_tl2_title.text())
self.tab2_tl3.canvas.axes.set_title(self.tab2_tl3_title.text())
self.tab2_tl4.canvas.axes.set_title(self.tab2_tl4_title.text())
self.tab2_tl1.canvas.axes.set_ylabel(self.tab2_tl1_ylabel.text())
self.tab2_tl2.canvas.axes.set_ylabel(self.tab2_tl2_ylabel.text())
self.tab2_tl3.canvas.axes.set_ylabel(self.tab2_tl3_ylabel.text())
self.tab2_tl4.canvas.axes.set_ylabel(self.tab2_tl4_ylabel.text())
可以想象,代碼變得非常冗長。有沒有更有效的方法來回圈遍歷所有這些參考和欄位?
uj5u.com熱心網友回復:
正如我在評論中所說,你可以使用getattr,但沒有進一步的背景關系,這是我能建議的最好的:
for i in range(1, 41):
for j in range(1, 5):
ax = getattr(self, f'tab{i}_tl{j}').canvas.axes
title = getattr(self, f'tab{i}_tl{j}_title').text()
ylabel = getattr(self, f'tab{i}_tl{j}_ylabel').text()
ax.set_title(title)
ax.set_ylabel(ylabel)
uj5u.com熱心網友回復:
您應該將相應的 tl、title 和 ylabel 放入字典中并將它們排列在嵌套串列中,而不是將名稱作為 tab1_tl1
像這樣創建它們:
tabs = []
for i in range(tabCount):
tab = []
tabs.append(tab)
for j in range(tlCount):
tab.append(dict(
obj = create_tl(i,j)),
title = create_title(i,j),
ylabel = create_ylabel(i,j) )
現在tabs[i][j]對應tabi_tlj,它是一個包含真實 tl 物件、標題和 ylabel 的字典。所以你可以像這樣更新屬性:
for tab in tabs:
for tl in tab:
tl['obj'].canvas.axes.set_title(tl['title'])
tl['obj'].canvas.axes.set_ylabel(tl['ylabel'])
一般來說,創建編號變數并不好。串列就是為了這個。也總是在字典或物件中收集相關的重復物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/330432.html
