想實作按一個按鈕顯示一幅圖,圖形界面是QT Designer生成的,查了好多資料都是自己用代碼生成的按鍵,而且畫圖函式都是在pyqt5的類里面,我的想法是用QT Designer生成的圖形界面只對他進行函式呼叫的宣告,把函式放在另一個py檔案里,這樣的話畫圖函式該怎么寫
uj5u.com熱心網友回復:
思路:在QT Designer設計時加入一個layout,在主程式中向layout中加入matplotlib。參考:https://blog.csdn.net/qissme/article/details/109098741uj5u.com熱心網友回復:
謝謝 但是這個繪圖函式 initUI和 showbox也是在類 mwindow里的,有沒有什么方法可以把函式放在外面,放在另一個py檔案里uj5u.com熱心網友回復:
發現了新問題,畫圖可以畫,但只能畫這樣的,代碼如下def Draw(self):
AgeList = ['10', '21', '12', '14', '25']
NameList = ['Tom', 'Jon', 'Alice', 'Mike', 'Mary']
#將AgeList中的資料轉化為int型別
AgeList = list(map(int, AgeList))
# 將x,y軸轉化為矩陣式
self.x = np.arange(len(NameList)) + 1
self.y = np.array(AgeList)
#tick_label后邊跟x軸上的值,(可選選項:color后面跟柱型的顏色,width后邊跟柱體的寬度)
plt.bar(range(len(NameList)), AgeList, tick_label=NameList, color='green', width=0.5)
# 在柱體上顯示資料
for a, b in zip(self.x, self.y):
plt.text(a-1, b, '%d' % b, ha='center', va='bottom')
#設定標題
plt.title("Demo")
#畫圖
self.canvas.draw()
我是要用資料框里面資料來畫圖,代碼如下
# 設定繪圖風格
plt.style.use('ggplot')
# 繪制不同收入水平下的年齡核密度圖
income.age[income.income == '<=50K'].plot(kind='kde', label='<=50K', legend=True, linestyle='-')
income.age[income.income == '>50K'].plot(kind='kde', label='>50K', legend=True, linestyle='--')
plt.show()
但是把它跟上面的def Draw(self)合并,設定一個按鈕進行系結,就會一直卡,然后閃退,如下
Process finished with exit code -1073740791 (0xC0000409)
我就試著看是什么原因,發現是def Draw(self)里面讀不到我的資料框,但是代碼又沒報錯,而且還能轉到宣告的地方,正常不用圖形界面代碼如下
income = pd.read_excel(r'income.xlsx', encoding='latin-1')
income.shape
這沒問題,改成下面的就有問題了
def Draw(self):
print(income.shape)
前面已經執行了匯入資料的函式,點擊這個函式系結的按鈕,就一直卡,然后閃退了,如下
Process finished with exit code -1073740791 (0xC0000409)
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
# 幾個QWidgets
self.figure = plt.figure() # 可選引數,facecolor為背景顏色
self.canvas = FigureCanvas(self.figure)
# self.button_draw = QPushButton("繪圖")
# 連接事件
# self.button_draw.clicked.connect(self.Draw)
self.pushButton_show.clicked.connect(self.Draw)
self.pushButton_clear.clicked.connect(self.Clear)
# 設定布局
# layout = QVBoxLayout()
self.verticalLayout.addWidget(self.canvas)
# layout.addWidget(self.button_draw)
# self.setLayout(layout)
def Draw(self):
print(income.shape)
這是pyqt5的類
uj5u.com熱心網友回復:
不用講來龍去脈,把代碼貼出來講一下有什么問題,你這貼了幾次太亂了
print('這樣貼代碼')
uj5u.com熱心網友回復:
這個代碼有意思,邏輯思維嚴謹,花了二十分鐘繞懂了,強烈建議使用這樣的表述習慣。uj5u.com熱心網友回復:
def Data_read():global income
income = pd.read_excel(r'income.xlsx', encoding='latin-1')
print("資料讀取成功!")
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
# 幾個QWidgets
self.figure = plt.figure() # 可選引數,facecolor為背景顏色
self.canvas = FigureCanvas(self.figure)
# self.button_draw = QPushButton("繪圖")
# 連接事件
self.pushButton_2.clicked.connect(self.Draw)
# 設定布局
# layout = QVBoxLayout()
self.verticalLayout.addWidget(self.canvas)
# layout.addWidget(self.button_draw)
# self.setLayout(layout)
def Draw(self):
print(income.shape)
if __name__ == "__main__":
# 每一pyqt5應用程式必須創建一個應用程式物件。sys.argv引數是一個串列,從命令列輸入引數。
app = QApplication(sys.argv)
myWin = MyMainWindow()
# 顯示在螢屏上
myWin.show()
myWin.pushButton_1.clicked.connect(Data_read)
sys.exit(app.exec_())
可以讀取資料,但是第二個按鈕不能print資料的規模,直接卡住然后閃退,把draw里面換成其他的就能用,用income這個資料框就不行,我猜測是他讀不到income這個資料框,但是他又沒報錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/201725.html
