プログラム初心者です。
現在Pythonを用いてコードを書いているのですが、Buttonをクリックした時の処理を記述するときに上手く実行できません。Kivyを用いてGUIを作成中ですが、Buttonを動的に生成する必要があります。
そこでkvファイルにはButtonを記述せず、pyファイル上で記述したいのです。
Button自体は生成されるのですが、どうもon_pressの部分でエラーが出ます。
エラー文
AssertionError: None is not callable
どのように記述すれば良いのでしょうか?ご教授ください。
動的に生成するpyファイル
import os from kivy.uix.boxlayout import BoxLayout from kivy.uix.gridlayout import GridLayout from kivy.uix.popup import Popup from kivy.uix.label import Label from kivy.uix.button import Button from kivy.core.window import Window from kivy.uix.video import Video from kivy.uix.image import Image from kivy.uix.videoplayer import VideoPlayer import kivy.core.video import pyglet from kivy.factory import Factory from kivy.lang import Builder class MovieChoseWindow(BoxLayout): def __init__(self, **kwargs): super(MovieChoseWindow, self).__init__(**kwargs) self.title = '動画選び' video_file_name_list=os.listdir("./MovieChose/") for i in range(len(video_file_name_list)): videoPath = str(video_file_name_list[i]) self.ReadeMovieFile(video_file_name_list[i]) def ReadeMovieFile(self,videoPath): print("ReadeMovieFileを実行") layout = self.ids.boxlayout button = Factory.Button( id = str(videoPath), background_normal = './MovieChose/' + str(videoPath), on_press = self.buttonClicked(str(videoPath)) ) print(str(videoPath)) layout.add_widget(button) print("ReadeMovieFileでbuttonを追加") def buttonClicked(self,videoPath): print("buttonClickedを実行") self.PlayMovie(videoPath) def buttonClickedTest(self): print("buttonClickedを実行") videoPath = "testmove.png" self.PlayMovie(videoPath) def PlayMovie(self,videoPath): print("playMovieを実行") text = str(videoPath) window = pyglet.window.Window(width=960, height=540) videoPath = text.replace('png', 'mp4') if(videoPath is not None): print(videoPath) video = pyglet.media.load(str(videoPath)) player = pyglet.media.Player() player.queue(video) @window.event def on_draw(): try: player.get_texture().blit(0,0) except: window.close() player.play() try: pyglet.app.run() except: print("動画終了")
対応するkvファイル
<Window1@BoxLayout> 変更 <MovieChoseWindow> orientation: "vertical" ActionBar: ActionView: ActionPrevious: title: 'MovieChoseWindow' with_previous: False ActionButton: text: '切り替え' on_press: print("change disp window 1"); app.root.change_disp() BoxLayout: id: boxlayout
ちなみに、on_pressを記述しなければ問題なくButtonは生成されます。
また、
on_press = self.buttonClicked(str(videoPath))
の部分を
on_press = self.buttonClicked
と書き換えると実行はされますが、メソッドに引数を渡したいので本来望む動きではありません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/08 02:27
2018/11/08 13:33
2018/11/09 01:33
2018/11/09 05:04