2016-01-26 3 views
1

Я изучаю, как использовать Tkinter для создания графических приложений, и я не могу понять, почему я не могу передать аргумент ширины и высоты через функцию класса __init__.Передача аргументов через класс, наследующий от Tkinter

Редактировать: Извините, взволнован. То, что он делает, говорит мне, что я передаю слишком много аргументов. И независимо от того, как я меняю параметры класса __init__ и Frame__init__, ничего не меняется. Это слишком много или недостаточно.

Edit_2: Хорошо, это работает без ошибок. Но он все еще не изменяет размер рамки.

Вот что я работаю с .:

#!/usr/bin/python 

from Tkinter import * 


class App(Frame): 
    def __init__(self, parent, width, height): 
     Frame.__init__(self, parent) 
     self.parent = parent 
     self.width = width 
     self.height = height 
     self.initUI() 

    def initUI(self): 

     self.parent.title("App") 
     self.grid() 

def main(): 

    root = Tk() 
    app = App(root, 300, 250) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 
+2

Ваш код, как указано, работает для меня. Можете ли вы добавить трассировку исключения, которое вы получаете на свой вопрос? – Blckknght

+0

Хм. Он работает без ошибок. Я разорвал несколько методов, используемых для размещения виджетов, чтобы не допустить его. Но кроме того, что он работает, он все еще не выполняет задачу, которую я пытаюсь выполнить. Для меня окно едва видно, когда оно вставляется. Затем я должен изменить размер вручную. –

+2

Вы должны установить размер главного окна ('root' - главное окно) или размер кадра. Но usin 'self.width' не изменит размер кадра. Вы должны использовать 'self.config (width = new_width)' – furas

ответ

3

self.width = width не изменяет размер кадра, поскольку использование кадров другой способ, чтобы изменить размер.

Первый способ: вы можете использовать Frame.__init__.

Frame.__init__(self, parent, width=width, height=height) 

См:

from tkinter import * 


class App(Frame): 
    def __init__(self, parent, width, height): 
     Frame.__init__(self, parent, width=width, height=height) 
     self.parent = parent 
     self.initUI() 

    def initUI(self): 

     self.parent.title("App") 
     self.grid() 

def main(): 

    root = Tk() 
    app = App(root, 300, 250) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Второй метод: вы можете использовать self.config(key=value) или self["key"] = value

self.config(width=width, height=height) 

или

self["width"] = width 
self["height"] = height 

См:

from tkinter import * 


class App(Frame): 
    def __init__(self, parent, width, height): 
     Frame.__init__(self, parent) 
     self.parent = parent 

     #self.config(width=width, height=height) 

     self["width"] = width 
     self["height"] = height 

     self.initUI() 

    def initUI(self): 

     self.parent.title("App") 
     self.grid() 

def main(): 

    root = Tk() 
    app = App(root, 300, 250) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

КСТАТИ: Frame.__init__ создает self.master и назначает parent для self.master, так что вы можете использовать self.master вместо self.parent


BTW: Вы можете создать окно без Frame

from tkinter import * 


class App(Tk): 

    def __init__(self, width, height): # no need "parent" 
     Tk.__init__(self) # no need "parent" 

     self["width"] = width 
     self["height"] = height 

     # OR   
     #self.geometry("%dx%d" % (width, height)) 
     #self.geometry("%dx%d+%d+%d" % (width, height, x, y)) 

     self.initUI() 

    def initUI(self): 

     self.title("App") # no need "parent" 
     # no need self.grid() 


def main(): 

    App(300, 250).mainloop() 

if __name__ == '__main__': 
    main() 
+0

О, прекрасное !! Абсолютно! Спасибо! Теперь он работает как шарм! –

+1

'Frame .__ init__' создает' self.master', и вы можете использовать его вместо 'self.parent' – furas

+0

Я заметил, когда добавлял в этот класс методы виджетов, которые мне не нужно было назначать, например, 'root' или' self.parent', в функцию '.grid'. Это нормально или это потому, что я использую 'Frame .__ init__'? –

Смежные вопросы