0

GUI のテキストボックスの更新に問題があります。コードは原則として次のようになります。

    # The Static_textbox module
    # -------------------------

    class TP_textbox(tk.LabelFrame):


        def __init__(self, master = None,bg='#000000'):

            tk.LabelFrame.__init__(self, master,text = 'Information')

            self.grid(row = 0, column = 0, columnspan = 1,rowspan = 1, 
                      padx = 15, pady = 15,sticky = tk.N+tk.W + tk.S+tk.E)

            self.create()


        def create(self):    
            self.v = tk.StringVar()
            self.v.set('Choose time interval and press the "Read data" button to load data')
            self.textbox = tk.Label(self, textvariable = self.v, 
                                    anchor=tk.W, justify=tk.LEFT, font=("Arial", 10, 'bold'))
            self.textbox.grid()        
            print 'not again!!!!!!!!!!!!!!!!!!!!!!!!!!!'


        def update_textbox(self,TEXT):

            self.v.set(TEXT)
            self.update_idletasks()         




    # Module calling Static_textbox
    # -----------------------------

    import Static_textbox

    def createPickel(my_dir = u'/test_data', 
                     start = ['2012','1','2','12','45'],
                     stop = ['2012','6','2','12','45'],
                     filterVal = "filtered",
                     myData = transpaper_DataHolder.DataHolder()):

        update_info = Static_textbox.TP_textbox()

        infoText = 'Locating data on server...'
        update_info.update_textbox(infoText)

「update_info = Static_textbox.TP_textbox()」という行が create 関数を含むモジュール全体を実行するため、古いテキストボックスの上に新しいテキストボックスが作成されることがわかりました。明らかに static_text モジュールの update 関数だけを呼び出したいのですが、これはどのように行われますか? このオブジェクト指向プログラミングは初めてです...愚かな質問で申し訳ありません。

編集:

以下の回答とコメントを読んだ後、解決策は次のようになるはずだと思います

メイン モジュールでテキスト ボックス オブジェクトを作成し、「データ ホルダー」モジュールに送信します。

# Main module

import Static_textbox
import transpaper_DataHolder

    def __init__(self, root):
    """ """
        self.Data = transpaper_DataHolder.DataHolder() #class that holds data
        tk.Frame.__init__(self, root)
        root.title(""" FerryBox Tools """)
        self._setupMainWindow()

    def _setupMainWindow(self):
        TextObj = Static_textbox.TP_textbox(root)
        self.Data.setTextObj(TextObj)

テキストボックスオブジェクトで「update_textbox」関数を呼び出すことができるデータホルダーモジュール:

# Data holder module

class DataHolder(object):

        def setTextObj(self,TextObj):
            self.TextObj = TextObj

        def getTextObj(self):
            return self.TextObj

「update_textbox」は、いくつかの異なるモジュールから呼び出されます。

# Typical call from other modules       

import transpaper_DataHolder

def createPickel(my_dir = u'/test_data', 
         start = ['2012','1','2','12','45'],
         stop = ['2012','6','2','12','45'],
         filterVal = "filtered",
         myData = transpaper_DataHolder.DataHolder()):  

    Data = myData

    infoText = 'Locating data on server...'
    TextObj = Data.getTextObj()
    TextObj.update_textbox(infoText)    

ただし、これは機能しません。エラーはありませんが、テキストボックスは更新されません。何か提案はありますか?

4

1 に答える 1

2

update_textbookstatic として宣言されていないため、静的関数として扱うことはできません(その機能は、オブジェクトを受け取ることを意味します)。

Python では、selfパラメーターはクラスのインスタンスを参照します。したがって、この場合は次のようにのみ使用できます。

# create a new text-book
textbook = Static_textbox.TP_textbox()

# update the textbook with some text
textbook.update_textbox("123")
于 2013-09-04T11:43:19.410 に答える