2

バックグラウンド

こんにちは、みんな!私は現在、テキストファイルをロードおよび保存できる基本的なGUIテキストエディタに取り組んでいます。ここで学習したように、ツールバーとテキストボックスに複数のフレームを使用したいと思います。私はOOPを使用しており、メソッドにフレームを設定し、__init__メソッドにウィジェットを設定しましたwidget。何らかの理由で、ウィジェットをそれぞれのフレーム内に配置できません。

コード

from Tkinter import *
class Application:
    def __init__(self,parent):  #initialize the grid and widgets
        self.myParent = parent

        #Init the toolbar
        self.toolbar = Frame(parent)
        self.toolbar.grid(row = 0)

        #Init frame for the text box

        self.mainframe = Frame(parent)
        self.toolbar.grid(row = 1)
    def widget(self):#Place widgets here

        #Save Button
        self.saveButton = Button (self, self.toolbar,
                                  text = "Save", command = self.saveMe)
        self.saveButton.grid(column = 0, row = 0, sticky = W)

        #Open Button
        self.openButton = Button (self, self.toolbar,
                                 text = "Open", command = self.openMe)
        self.openButton.grid(column = 0, row = 1, sticky = W)
        #Area where you write 
        self.text = Text (self, self.mainframe,
                          width = (root.winfo_screenwidth() - 20),
                          height = (root.winfo_screenheight() - 10))
       self.text.grid(row = 2)

質問

  1. まださまざまな方法を使用していますが、各ウィジェットが正しいフレームに配置されていることを確認するにはどうすればよいですか?

    • これが不可能な場合は、OOPを使用してそれを行う方法を教えてください-私はその設定でTkinterに最も慣れており、改善することを約束しました。
  2. あなたの答えを説明してください。私は同族である必要があります-単にコンピューターに頭を頷いて、すぐに進むのではありません。

  3. 追加のクレジット:OOPでTkinterを使用して複数のウィンドウ(各ウィンドウは異なるクラス)を初期化するにはどうすればよいですか?たとえば、これが私のコードだった場合:

    class MainWindow(Frame):
        ---init stuff---
        def widget(self):
            newWindow = Button(self, text = "click for a new window",
                               command = self.window)
            newWindow.grid()
       def window(self):
             #What would I put in here to initialize the new window??
    
    class theNextWindow(Frame):
    

    ウィンドウを表示window.selfするためのメソッドには何を入れますか?theNextWindow

みんなの助けてくれてありがとう!

編集1

self.widget()メソッドに行を追加する__init__と、この「素晴らしい」エラーが発生しました。

Traceback (most recent call last):
File "D:\Python Programs\Text Editor\MyTextv2.py", line 67, in <module>
 app = Application(root)
File "D:\Python Programs\Text Editor\MyTextv2.py", line 14, in __init__
 self.widget()
File "D:\Python Programs\Text Editor\MyTextv2.py", line 24, in widget
 text = "Save", command = self.saveMe)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 2044, in __init__
 Widget.__init__(self, master, 'button', cnf, kw)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1965, in __init__
 BaseWidget._setup(self, master, cnf)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1943, in _setup
 self.tk = master.tk
AttributeError: Application instance has no attribute 'tk'

エラーログがここで私のメインループを明確に参照しているので、私File "D:\Python Programs\Text Editor\MyTextv2.py", line 67, in <module> app = Application(root)はそれを追加することにしました:

root = Tk()
root.title("My Text Editor")

#This is wierd - it gets the computer windows dimensions
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(0)

#And then applies them here
root.geometry("%dx%d+0+0" % (w, h))

app = Application(root)

root.mainloop()
4

2 に答える 2

3

私はついに答えを見つけました。私が見つけたもの(間違っている場合はこれを自由に編集してください)はFrame、Tkinterで継承できる方法は2つしかないということです。クラス自体とウィジェットが現在あるメソッドからです。問題を解決するには、クラスをフレームとして設定し、そのApplication中に他のフレームを配置します。これが私がしたことの基本的な表現です:

#Import Tkinter
from Tkinter import *

#Main Frame
class Application(Frame):
    def __init__(self, master):  #initialize the grid and widgets
        Frame.__init__(self,master)
        self.grid()
        self.redFUN() #initialize the red frame's Function
        self.greenFUN() #initialize the green frame's Function
        self.widgets() #To show that you can still place non-Frame widgets 
    def widgets(self):
        self.mylabel = Label (self, text = "Hello World!")
        self.mylabel.grid()
    def redFUN(self): #The 'self' means that it is an instance of the main frame
        #Init the red frame
        self.redFrame = Frame(root, width = 100, height = 50,pady = 5,
                              bg = "red")
        self.redFrame.grid()



    def greenFUN(self): #Child of the mainframe
        self.greenFrame = Frame(root, width = 100, height = 50,pady = 5,
                          bg = "green") #it is green!
        self.greenFrame.grid()








#These lines of code are used for the grid
root = Tk()
root.title("Frame Example")
root.geometry("300x300")
app = Application(root)

root.mainloop()

これが皆さんのお役に立てば幸いです。ご不明な点がございましたら、お気軽にコメントしてください。

于 2013-02-16T17:24:18.683 に答える
1

問題1:

ウィジェットは、直接の親を1つだけ持つことができます。2つの親を渡すための構文はありません。たとえば、あなたは両方selfself.toolbarの親として渡されているようです。self.saveButton

myButton = Button(self.toolbar, text="Blah", command=self.someCommand)

使用する必要があるフォームです。

問題2:

Application代わりに(別名selfin Button(self, self.toolbar...))をの親にしたいとしますmyButton。Tkウィジェットの階層的な親になるには、クラスものインスタンスである必要があるため、これも機能しませんWidget。通常、これが必要な場合は、次のように継承tk.Tk()Applicationます。

class Application(Tk):

    def __init__(self, *args, **kwargs):


        Tk.__init__(self, *args, **kwargs) #It's important that you call the parent class's __init__ method first

        self.createWidgets()

    def createWidgets(self):

        self.myButton = Button(self, text="Blah", command=lambda x: print "x")
        #this is ok, because now self (AKA Application) is a valid instance of Tk
于 2013-02-14T01:24:03.067 に答える