【问题标题】:Kivy screen transition doesn't work, when Matplotlib plotted当 Matplotlib 绘制时,Kivy 屏幕转换不起作用
【发布时间】: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


    【解决方案1】:

    万一有人遇到同样的问题……更改后问题就消失了

    self.canvas = self.fig.canvas
    self.hist2show.add_widget(self.canvas)
    

    canvas = self.fig.canvas
    self.hist2show.add_widget(canvas)
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多