【发布时间】:2021-09-30 15:02:47
【问题描述】:
当我使用 matplotlib 绘制直方图时,无法转换回 MainSceen。我可以切换到 SecondScreen,但屏幕看起来很奇怪(两个屏幕重叠):
单击“返回第一个屏幕”会产生错误:TypeError: Argument 'c' has wrong type (expected kivy.graphics.instructions.Instruction, got FigureCanvasKivy)
小例子:
from kivy.app import App
from kivy.uix.button import Button
from kivy.config import Config
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
from kivy.clock import Clock
import random
import matplotlib
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
from matplotlib import pyplot as plt
class ScreenManagement(ScreenManager):
pass
class MainScreen(Screen):
def __init__(self,**kwargs):
super(MainScreen, self).__init__(**kwargs)
Clock.schedule_once(self.show_hist)
def show_hist(self, *args):
self.toPlot = random.sample(range(1, 36), 30)
self.fig = plt.figure()
self.ax = self.fig.add_subplot(111)
self.ax.set_xlabel('Score', fontsize=30)
self.ax.set_ylabel('Frequency', fontsize=30)
self.ax.set_title('Histogram of scores',fontsize=30)
plt.xticks(fontsize=30)
plt.yticks(fontsize=30)
self.binsize = 36
self.h = self.ax.hist(self.toPlot, self.binsize)
self.canvas = self.fig.canvas
self.hist2show.add_widget(self.canvas)
class SecondScreen(Screen):
def __init__(self,**kwargs):
super(SecondScreen, self).__init__(**kwargs)
# load kivy file
presentation = Builder.load_file("demo_kivy.kv")
class normApp(App):
# change color to white
Window.clearcolor = (1, 1, 1, 1)
def build(self):
return presentation
if __name__ == '__main__':
normApp().run()
基维文件:
ScreenManagement:
MainScreen:
name: "MainScreen"
id: main_screen
SecondScreen:
name: "SecondScreen"
id: second_screen
<MainScreen>:
name: "MainScreen"
hist2show:hist2show
GridLayout:
cols:2
rows:3
BoxLayout:
id: hist2show
color: 0, 0, 1, 1
background_color: 0.2, 0.2, 0.2, 0.2
Button:
text: "Next screen"
color: 0, 0, 0, 1
background_color: 0.2, 0.2, 0.2, 0.2
on_release: app.root.current = "SecondScreen"
<SecondScreen>
name: "SecondScreen"
Button:
text: "Go back to the first screen"
color: 0, 0, 0, 1
background_color: 0.2, 0.2, 0.2, 0.2
on_release: app.root.current = "MainScreen"
【问题讨论】:
标签: python matplotlib kivy kivy-language