2016-05-16 15 views
0

私はTkinterプロジェクトのオブジェクト指向プログラミングを教えてきました。しかし、私は、その目的が何であるかを完全には理解していないだけで、オンラインからさまざまなコーディングのコードをコピーするだけで惰走してきたことを認めなければなりません。オブジェクト指向のTkinterコーディング:テキストの変更と更新

これは、私のコードがまったく動作しない理由を私に導きました。私はなぜそうではないのか分かりません。最初の問題は、単に他のウィジェットの側面を変更することによる問題です。

私は、このサンプルコードがあります:「それが変更された」にボタンを押すと、「スタートページ」からラベルを変更する、シンプルな十分なコードであるべきである

import Tkinter as tk 

LARGE_FONT = ("Verdana", 12) 

class SeaofBTCapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 
     container.pack(side="top", fill = "both", expand = True) 
     container.grid_rowconfigure(0, weight = 1) 
     container.grid_columnconfigure(0 , weight = 1) 

     self.frames = {} 
     frame = StartPage(container, self) 
     self.frames[StartPage] = frame 

     frame.grid(row = 0, column = 0, sticky = "nsew") 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 

class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     label = tk.Label(self, text = "Start Page", font = LARGE_FONT) 
     label.pack(pady = 10, padx = 10) 
     button = tk.Button(self, text = "Change Label", command = self.change) 
     button.pack(pady = 10, padx = 10) 

    def change(self): 
     label["text"] = "It has changed" 

app = SeaofBTCapp() 
app.mainloop() 

を。しかし、私はそれを実行するたびに、グローバル変数 "label"は定義されていないと言います。さらに、私はそれをself.labelに変更すると、StartPageインスタンスに属性 'label'がないことが示されます。私は何が間違っているのか分からない。

同様に、私はSideBarクラスと1つのMainApplicationクラスに関連付けられたMainクラスを持つプロジェクトに取り組んでいます。 Mainクラスは値を受け取り、MainクラスのFrameにそれを表示します。これに続いて、サイドバーのボタンはその値を1だけ増やしますが、メインディスプレイは更新されず、サイドバーのボタンでメインの更新をどのように結びつけるのか分かりません。

import Tkinter as tk 

something = [0, 6] 

class Main(): 
    def __init__(self, root): 
     mainboard = tk.Frame(root, height = 100, width = 100) 
     self.maincanvas = tk.Canvas(mainboard, bd = 1, bg = "white") 

     mainboard.grid(row = 0, column = 0) 
     self.maincanvas.grid(row = 0, column = 0) 

     self.maincanvas.create_text(45, 50, anchor = "center", text = str(something[1])) 

class SideBar(): 
    def __init__(self, root): 
     sidebarframe = tk.Frame(root, height = 100, width = 100) 
     button = tk.Button(sidebarframe, width = 20, text = "Change Value", command = self.add) 

     sidebarframe.grid(row = 0, column = 1) 
     button.grid(row = 0, column = 0) 

    def add(self): 
     something[1] += 1 
     print something[1] 


class MainApplication(): 
    def __init__(self, parent): 
     self.parent = parent 
     self.sidebar = SideBar(self.parent) 
     self.main = Main(self.parent) 

if __name__ == "__main__": 
    root = tk.Tk() 
    MainApplication(root) 
    root.mainloop() 

すべてのヘルプは感謝、私はまだ勉強として、専門用語の多くを使用してみないことになる下さい。最初のシナリオでは

答えて

0

置き換える:

label = tk.Label(self, text = "Start Page", font = LARGE_FONT) 
label.pack(pady = 10, padx = 10) 

付:

self.label["text"] = "It has changed" 

そして、あなたの第二の問題の私で:

機能 change
self.label = tk.Label(self, text = "Start Page", font = LARGE_FONT) 
self.label.pack(pady = 10, padx = 10) 

そしてまた、このようにそれを置きますコードを少し変更したので動作します:

import Tkinter as tk 

something = [0, 6] 

class Main(): 
    def __init__(self, root): 
     mainboard = tk.Frame(root, height = 100, width = 100) 
     self.maincanvas = tk.Canvas(mainboard, bd = 1, bg = "white") 

     mainboard.grid(row = 0, column = 0) 
     self.maincanvas.grid(row = 0, column = 0) 

     self.maincanvas.create_text(45, 50, anchor = "center", text = str(something[1])) 

class SideBar(): 
    def __init__(self, root, main): 
     self.main = main            # Putting the main object to self.main 
     sidebarframe = tk.Frame(root, height = 100, width = 100) 
     button = tk.Button(sidebarframe, width = 20, text = "Change Value", command = self.add) 

     sidebarframe.grid(row = 0, column = 1) 
     button.grid(row = 0, column = 0) 

    def add(self): 
     something[1] += 1 
     self.main.maincanvas.delete("all")               # Removing everything from canvas 
     self.main.maincanvas.create_text(45, 50, anchor = "center", text = str(something[1]))  # Inserting the new value 
     print something[1] 


class MainApplication(): 
    def __init__(self, parent): 
     self.parent = parent 
     self.main = Main(self.parent)      # The main needs to run first 
     self.sidebar = SideBar(self.parent, self.main)  # So that SideBar can use its canvas 

if __name__ == "__main__": 
    root = tk.Tk() 
    MainApplication(root) 
    root.mainloop() 
関連する問題