2

私は以前にPythonを使用したことがなく、誰かがこれで正しい方向に向けることができることを望んでいます.2つのウィンドウを持つGUIが欲しかったので、コードサンプルを見つけました。ラズベリーパイ用のRPi.GPIOをこれに統合しようとしていますが、これは正常に機能しているようです。これまでに管理したものは次のとおりです。

http://pastebin.com/9aWDgg0r

問題は、関数からテキストを追加するためにテキストウィジェットにアクセスできないことです.これは、関数が変更したいウィジェットのクラスの外にあるためだと理解しています. では、クラスの外部からウィジェットを参照して変更するにはどうすればよいでしょうか?

def check_five(): 
    if (GPIO.input(25) == GPIO.HIGH):
        fiveTimes_out()
    log.insert('1.0', '5 button down')
    root.after(10,check_five)


class MyApp(object):
    """"""
    #----------------------------------------------------------------------
    def __init__(self, parent):

        """Constructor"""
        self.root = parent
        self.root.title("Main frame")
        self.frame = Tk.Frame(parent)
        self.frame.pack()

        ....

        log = Tk.Text(state='normal', width=70, height=10, wrap='none')
        log.place(x=40, y=160)   

log.insert('1.0', '5 ボタン ダウン') は MyApp.log.insert('1.0', '5 ボタン ダウン') のようにする必要がありますか?

これらの関数をクラスに移動することはできますが、関数を .after で実行する方法や、これらを配置する場所がわかりません。

    root.after(10,check_five)
    root.after(10,check_two)
    root.after(10,check_one)
    root.after(10,check_toggle)

どんな助けでも素晴らしいでしょう、ありがとう。

4

2 に答える 2

2
  • check_fiveの、、および メソッドを作成しcheck_twoます。check_onecheck_toggleMyApp
  • で定義self.log = Tk.TextMyApp.__init__ます。そうすれば、 の他のメソッドはMyAppを参照できますself.log
  • if __name__ == "__main__":スクリプト の一部で、app.check_five代わりにを使用しての メソッドcheck_fiveを参照します。他の方法についても同様です。appcheck_fivecheck_*

import Tkinter as Tk
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

# setup 5 output pin
GPIO.setup(11, GPIO.OUT)
# setup 2 output pin
GPIO.setup(14, GPIO.OUT)
# setup 1 output pin
GPIO.setup(15, GPIO.OUT)

# set low output states on start
GPIO.output(11, GPIO.LOW)
GPIO.output(14, GPIO.LOW)
GPIO.output(15, GPIO.LOW)

# setup 5 input pin
GPIO.setup(25, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
# setup 2 input pin
GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
# setup 1 input pin
GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

# setup window toggle pin
GPIO.setup(22, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)


# out functions light certain led a number of times     
def fiveTimes_out():
    #1
    GPIO.output(11, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(11, GPIO.LOW)
    time.sleep(0.200)
    #2
    GPIO.output(11, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(11, GPIO.LOW)
    time.sleep(0.200)
    #3
    GPIO.output(11, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(11, GPIO.LOW)
    time.sleep(0.200)
    #4
    GPIO.output(11, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(11, GPIO.LOW)
    time.sleep(0.200)
    #5          
    GPIO.output(11, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(11, GPIO.LOW)
    time.sleep(0.200)

def twoTimes_out():
    #1
    GPIO.output(14, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(14, GPIO.LOW)
    time.sleep(0.200)
    #2
    GPIO.output(14, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(14, GPIO.LOW)
    time.sleep(0.200)        

def oneTimes_out():
    #1
    GPIO.output(15, GPIO.HIGH)
    time.sleep(0.200)
    GPIO.output(15, GPIO.LOW)
    time.sleep(0.200)



########################################################################
class OtherFrame(Tk.Toplevel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        Tk.Toplevel.__init__(self)
        self.geometry("640x480+0+0")
        self.configure(background = 'yellow')

        self.title("otherFrame")

########################################################################
class MyApp(object):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):

        """Constructor"""
        self.root = parent
        self.root.title("Main frame")
        self.frame = Tk.Frame(parent)
        self.frame.pack()

        btn = Tk.Button(self.frame, text = "Other Window", command = self.openFrame)
        btn.pack()

        btn2 = Tk.Button(self.frame, text = "Function test", command = twoTimes_out)
        btn2.pack()

        titleLabel = Tk.Label(text = "My Label")
        titleLabel.place(x = 40, y = 60)

        insertLabel = Tk.Label(text = "Label")
        insertLabel.place(x = 170, y = 110)

        self.log = Tk.Text(state = 'normal', width = 70, height = 10, wrap = 'none')
        self.log.place(x = 40, y = 160)

        thanksLabel = Tk.Label(text = "Thank You!")
        thanksLabel.place(x = 70, y = 350)

        self.log.insert('1.0', 'here is my text to insert')


    #----------------------------------------------------------------------
    def hide(self):
        """"""
        self.root.withdraw()

    #----------------------------------------------------------------------
    def openFrame(self):
        """"""
        self.hide()
        subFrame = OtherFrame()
        handler = lambda: self.onCloseOtherFrame(subFrame)
        btn = Tk.Button(subFrame, text = "Close", command = handler)
        btn.pack()
        secondPageLabel = Tk.Label(text = "HI")
        secondPageLabel.place(x = 170, y = 110)

    #----------------------------------------------------------------------
    def onCloseOtherFrame(self, otherFrame):
        """"""
        otherFrame.destroy()
        self.show()

    #----------------------------------------------------------------------
    def show(self):
        """"""
        self.root.update()
        self.root.deiconify()

    # in functions check if buttons are pushed and run specific functions
    # also write messages to log    

    def check_five(self): 
        if (GPIO.input(25) == GPIO.HIGH):
            fiveTimes_out()
            self.log.insert('1.0', '5 button down')
        else:
            self.log.insert('1.0', '5 button up')
        root.after(10, self.check_five)

    def check_two(self): 
        if (GPIO.input(24) == GPIO.HIGH):
            twoTimes_out()
            self.log.insert('1.0', '2 button down')
        else:
            self.log.insert('1.0', '2 button up')
        root.after(10, self.check_five)

    def check_one(self): 
        if (GPIO.input(23) == GPIO.HIGH):
            oneTimes_out()
            self.log.insert('1.0', '1 button down')
        else:
            self.log.insert('1.0', '1 button up')
        root.after(10, self.check_five)

    # check if window toggle button is pushed
    # you reference self in check_toggle, so check_toggle should probably be a method.
    def check_toggle(self): 
        if (GPIO.input(22) == GPIO.HIGH):
            self.openFrame()                 
        root.after(10, check_toggle)

#----------------------------------------------------------------------
if __name__ == "__main__":
    root = Tk.Tk()

    root.geometry("640x480+0+0")
    root.configure(background = 'red')
    app = MyApp(root)
    root.after(10, app.check_five)
    root.after(10, app.check_two)
    root.after(10, app.check_one)
    root.after(10, app.check_toggle)
    root.mainloop()
于 2012-12-12T21:21:22.520 に答える
1

__init__MyAppのメソッドではlog、インスタンス変数 ( do self.log = log) として保存する必要があるため、 を離れた後も存在し__init__ます。MyApp のメソッドにすることをお勧めしcheck_fiveます。その場合、 経由でログにアクセスできますself.log。分離したい場合は、以前に を実行して作成したcheck_fiveのような方法でアクセスできます。MyApp 内から after を使用してメソッドを実行する場合は、次のようにアクセスできます。myapp.logmyappmyapp = MyApp(root)self.check_five

于 2012-12-12T21:09:02.887 に答える