2017-07-05 30 views
0

編集:Kivyのドキュメントの右の最初の質問に答えました。 mygridwidをしてから、このKivyの1つのボタンから別のクラスのメソッドを呼び出す

Switch: 
       id: startbutton 
#    text: "Start/Stop" 
#    size_hint_x: 1 
       on_active: root.get_apptime(self, self.active, mygridwid) 

ように私の方法のget_apptimeにそれを渡す今、すべてがコンパイルされ、私はときにアクティブシステムがupdateメソッドを呼び出して見ることができます: は基本的に私はmygridwid_widgetようKVファイルにpropoertyを追加する必要がスイッチ。私の問題はUIが更新されたグリッドを再描画していないようだが、デバッガを実行するとグリッドが作成され、データが取り込まれていることがわかる。誰でも私が間違っていることを知っていますか?


私はKivyの新機能で、Pythonにはあまり興味がありません。私の問題は、プロジェクトのための簡単なGUIを作っていることです。私のGUIでは、システムをオンにし、テスト時間を追跡し、メインスイッチがオンの間はグリッドレイアウトをデータで更新するボタンが必要です。オフの場合、ボタンを更新しないでください。今は主UI要素のプロトタイプを作成しようとしています。後者はMQTTコードを接続してデータをシステムにプッシュします。私は特にここBDdemoFormクラスget_apptimeメソッドからMyGridクラスでupdate_dataメソッドを呼び出す方法を知りたいの下に私のコードで

import time 
from kivy.app import App 
from kivy.properties import ObjectProperty 
from kivy.properties import StringProperty 
from kivy.properties import BooleanProperty 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.label import Label 
#custom and helper classes 
import labelb 
import DeviceData 
#import AppState 
class TableHeader(Label): 
    pass 

class PlayerRecord(Label): 
    pass 

class BSdemoRoot(BoxLayout): 
    pass 

myappstate = BooleanProperty() 
myappstate = False 
#mygridob = MyGrid() 
# class my widget 
class BSdemoForm(BoxLayout): 
    bsdemo_currenttime = StringProperty() 
    device_data = ObjectProperty() 

    def __init__(self, **kwargs): 
     super(BSdemoForm, self).__init__(**kwargs) 
     self.bsdemo_currenttime = "0" 

    def get_apptime(self, instance, value): 
     myappstate = value 

     if myappstate == True: 
      self.bsdemo_currenttime = time.asctime() 
      root.MyGrid.update_display() 
      #MyGrid(self).update_display() 
      print(myappstate) 
     else: 
      self.bsdemo_currenttime = "0" 
      print(myappstate) 
     # sys_data = self.get_devicedata() 
#create a data manager class 
class MyGrid(GridLayout): 
    def __init__(self, **kwargs): 
     super(MyGrid, self).__init__(**kwargs) 
     self.get_tableheaders() 
     self.get_devicedata() 
     self.display_data() 

    def get_tableheaders(self): 
     self.tabledata = [ 
      {'LRT': 'Last Recived Time', 'Type': 'Classification Type', 'STR': 'Session Time Remaining'}, 
     ] 

    def get_devicedata(self): 
     self.data = [ 
      {'LRT': '8.243', 'Type': 'DJI Mavic', 'STR': '4.39'}, 
      {'LRT': '5.243', 'Type': 'Parrot BeBop', 'STR': 'Close'}, 
      {'LRT': '7.11', 'Type': 'Parrot Ebee', 'STR': 'Close'}, 
      {'LRT': '5.3', 'Type': 'Parrot DISCO', 'STR': '11.12'}, 
      {'LRT': '3.20', 'Type': 'Yuneec Typhoon', 'STR': '2.13'}, 
      {'LRT': '5.44', 'Type': 'Yuneec', 'STR': '5.23'}, 
      {'LRT': '1.12', 'Type': 'DJI Pro 4', 'STR': '1.10'}, 
      {'LRT': '2', 'Type': 'Parrot Sumo', 'STR': '2.3555'} 
     ] 

# assembles the items to be pushed into the gridlayout widget 


    def display_data(self): 
     self.clear_widgets() 
     print(myappstate) 
     for myi in xrange(len(self.tabledata)): 
      print("display data method was run") 
      myrow = self.create_header(myi) 
      for myitem in myrow: 
       self.add_widget(myitem) 

     if myappstate == True: 
      for i in xrange(len(self.data)): 
       row = self.create_player_info(i) 
       #add all the items to the widget 
       for item in row: 
        self.add_widget(item) 

    @classmethod 
    def update_display(self): 
     self.clear_widgets() 
     print(myappstate) 
     for myi in xrange(len(self.tabledata)): 
      print("update data display was called") 
      myrow = self.create_header(myi) 
      for myitem in myrow: 
       self.add_widget(myitem) 

     if myappstate == True: 
      for i in xrange(len(self.data)): 
       row = self.create_player_info(i) 
       #add all the items to the widget 
       for item in row: 
        self.add_widget(item) 



# this allows you to change the tableheader column names and number 
    def create_header(self,i): 
     first_column = TableHeader(text=self.tabledata[i]['LRT']) 
     second_column = TableHeader(text=self.tabledata[i]['Type']) 
     third_column = TableHeader(text=self.tabledata[i]['STR']) 
     return [first_column, second_column, third_column] 

# puts the data into the right column to build the table 
    def create_player_info(self, i): 
     first_column = PlayerRecord(text=self.data[i]['LRT']) 
     second_column = PlayerRecord(text=self.data[i]['Type']) 
     third_column = PlayerRecord(text=self.data[i]['STR']) 
     return [first_column, second_column, third_column] 

class BSKivyApp(App): 
    pass 

if __name__ == '__main__': 
    BSKivyApp().run() 
:とにかくここ

def get_apptime(self, instance, value): 
     myappstate = value 

     if myappstate == True: 
      self.bsdemo_currenttime = time.asctime() 
      #how do i call this method in this class 
      root.MyGrid.update_display() 

      print(myappstate) 
     else: 
      self.bsdemo_currenttime = "0" 
      print(myappstate) 

は私のコード、main.pyです

ここに私のkvファイルBSKivy.kyがあります。

#: import ListItemLabel kivy.uix.listview.ListItemLabel 
#: import ListAdapter kivy.adapters.listadapter.ListAdapter 

<PlayerRecord>: 
    id: myplayer 
    size_hint_y: None 
    height: '30dp' 
    width: '100dp' 

    canvas.before: 
     Color: 
      rgb: 0.2, 0.2, 0.2 
     Rectangle: 
      pos: self.pos 
      size: self.size 

<TableHeader>: 
    id: myheader 
    size_hint_y: None 
    height: '30dp' 
    width: '100dp' 

    canvas.before: 
     Color: 
      rgb: 0.5, 0.5, 0.5 
     Rectangle: 
      pos: self.pos 
      size: self.size 

BSdemoRoot: 
<BSdemoRoot>: 
    BSdemoForm 
<BSdemoForm> 
    orientation: "vertical" 
    #device_data: device_data_results 
    BoxLayout: 
     orientation: "vertical" 
     BoxLayout: 
      Label: 
       text: "BS Demo Interface and GUI" 
     BoxLayout: 
      Label: 
       text: "Current Time" 
       size_hint_x: 1 
      Label: 
       id: app_runtime_label 
       text: root.bsdemo_currenttime 
       size_hint_x: 1 
      Switch: 
       id: startbutton 
#    text: "Start/Stop" 
#    size_hint_x: 1 
       on_active: root.get_apptime(self, self.active) 

       # ; app.root.MyGrid.display_data(self) 
     ScrollView: 
      size_hint_y: None 
      height: '200dp' 

      MyGrid: 
       id: mygridwid 
       cols: 3 
       size_hint_y: None 
       height: self.minimum_height 
       spacing: '1dp' 

     BoxLayout: 
      Label: 
       text: "replace with a button" 

答えて

0

だから私はこれを働かせて閉じます。基本的に、私は2つの問題がありました。 1つは、プロパティとIDを正しく使用する方法を理解していませんでした。私の2番目の問題は、単純な可変スコープの問題でした。

関連する問題