2017-06-25 2 views
1

のクラスdefを使用してウィジェットを表示できません。ブログ、チュートリアルなどで見ると、次のコードではフレームにラベルが表示されない理由を理解できませんでした。クラスを定義していないときにこのタスクをうまく実行できますが、フレームやその他のウィジェットをより動的に作成できるようにこのアプリケーションを作成したいと考えています。ここにコードがあります。 が正常に動作し、ルートウィンドウにフレームが適切に表示されます。コードはエラーなしで実行されます。 print文とprint(type())文をadd_heading関数から追加しましたが、ラベルは表示されません。私が間違っていることを誰かが教えてくれることを願っています。おかげで事前は、既存のフレーム

#!/usr/bin/python3 
from tkinter import * 

class CompFrame(Tk): 

    def __init__(self, parent, rows, columns, title): 
     Frame.__init__(self, parent) 
     self.root = parent 
     f_w = screen_width/3 
     f_h = screen_height * .90 
     self = LabelFrame(root, text=title, width=f_w, height=f_h, bg="light grey") 
     self.grid_columnconfigure(columns, weight=1) 
     self.grid(row=rows, column=columns) 
     self.grid_propagate(False) 

    def add_heading(self, title): 
     label_width=12 
     ftitle = Label(self, text=title) 
     ftitle.configure(font='Helvetica 24 bold', width=label_width) 
     ftitle.place(x=".5i", y=".2i") 

root = Tk() 
root.grid_rowconfigure(0, weight=1) 
root.grid_columnconfigure(0, weight=1) 

screen_width = root.winfo_screenwidth() 
screen_height = root.winfo_screenheight() 
root.geometry("%dx%d%d%d" % (screen_width,screen_height,0,0)) 

Calibrator = PhotoImage(file="image1.png") 
Feeeder = PhotoImage(file="image2.PNG") 

frame1 = CompFrame(root, 0, 0, "Component 1") 
frame1.add_heading("NATURAL") 

root.mainloop() 
+1

あなた 'CompFrame'は' Frame'、ない 'Tk'から継承する必要があります。これはすべての問題ではありませんが、問題の一部です。 –

答えて

0

self = LabelFrame(root ...部分が多分labelframeの制御を維持するために、このような何かをしようと、有罪である:

from tkinter import * 

class CompFrame(Frame): # Edit with Bryan Oakley comment 

    def __init__(self, parent, rows, columns, title): 
     Frame.__init__(self, parent) 
     self.root = parent 
     f_w = screen_width/3 
     f_h = screen_height * .90 
     self.labelframe = LabelFrame(root, text=title, width=f_w, height=f_h, bg="light grey") 
     self.labelframe.grid_columnconfigure(columns, weight=1) 
     self.labelframe.grid(row=rows, column=columns) 
     self.labelframe.grid_propagate(False) 

    def add_heading(self, title): 
     label_width=12 
     ftitle = Label(self.labelframe, text=title) 
     ftitle.configure(font='Helvetica 24 bold', width=label_width)    
     ftitle.place(x=5, y=2) 
+0

ありがとうございます - それはうまくいきました - これを見ている日を過ごしていました - これを説明する文書に私を指摘できますか?私はこれを機能させたいだけでなく、 __init__のLabelFrameは、selfがLabelFrameであったため、そのインスタンス化が関数に渡されていたはずです。なぜそれができなかったのか分かりません。なぜ、私はLabelFrameリファレンスを保持するために自分自身を作成し​​属性を持たなければならないのでしょうか(私は意味があることを望みます) – Kurt

+1

、 'self'はあなたが作成したインスタンスを参照します' frame1 = CompFrame(...) 'この 'self'を別のウィジェットに割り当てます。あなたはちょっとオブジェクトを混乱させるでしょう。他のウィジェットを管理するには、ここで 'self.labelframe'のような新しいクラス属性にリンクするだけで、親を持つ単純な階層に従います(root> compFrame> labelFrame> label) – PRMoureu

+0

@Kurt http://zetcode.com/ gui/tkinter/layout /、ここにたくさんの例があります – PRMoureu