2017-02-14 2 views
0

Для новичков в Tkinter и просто в среднем на Python трудно найти нужный материал на tkinter. Вот проблема, которую я встречал (и начинаю решать). Я думаю, проблема возникла из версии python.TypeError в 2 классах приложение tkinter

Я пытаюсь сделать GUI, в ООП, и мне трудно сочетать разные классы.

Скажем, у меня есть «маленькая коробка» (например, строка меню), и вы хотите поместить ее в «большую коробку». Работа из этого учебника (http://sebsauvage.net/python/gui/index.html), я пытаюсь следующий код

#!usr/bin/env python3.5 
# coding: utf-8 
import tkinter as tki 

class SmallBox(tki.Tk): 
    def __init__(self,parent): 
     tki.Tk.__init__(self,parent) 
     self.parent = parent 
     self.grid() 
     self.box = tki.LabelFrame(self,text="small box") 
     self.box.grid() 
     self.graphicalStuff = tki.Entry(self.box) # something graphical 
     self.graphicalStuff.grid() 

class BigBox(tki.Tk): 
    def __init__(self,parent): 
     tki.Tk.__init__(self,parent) 
     self.parent = parent 
     self.grid() 
     self.box = tki.LabelFrame(self,text='big box containing the small one') 
     self.graphStuff = tki.Entry(self.box) # something graphical 
     self.sbox = SmallBox(self) 
     self.graphStuff.grid() 
     self.box.grid() 
     self.sbox.grid() 

Но я получил следующее сообщение об ошибке.

File "/usr/lib/python3.5/tkinter/__init__.py", line 1871, in __init__ 
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) 
TypeError: create() argument 1 must be str or None, not BigBox 

ответ

0

Код выглядит очень похож на этот: Best way to structure a tkinter application

Но есть одна небольшая разница, мы не работаем в кадре здесь. И ошибка запрашивает проблему в screenName и т. Д., Которая, интуитивно, больше похожа на Frame.

На самом деле, я бы сказал, что в Python3 вы не можете использовать больше версию первого урока, и вы должны использовать рамку, и код-то вроде этого:

#!usr/bin/env python3.5 
# coding: utf-8 
import tkinter as tki 
class SmallBox(tki.Frame): 
    def __init__(self,parent): 
     tki.Frame.__init__(self,parent) 
     self.parent = parent 
     self.grid() 
     self.box = tki.LabelFrame(self,text="small box") 
     self.box.grid() 
     self.graphicalStuff = tki.Entry(self.box) # something graphical 
     self.graphicalStuff.grid() 

class BigBox(tki.Frame): 
    def __init__(self,parent): 
     tki.Frame.__init__(self,parent) 
     self.parent = parent 
     self.grid() 
     self.box = tki.LabelFrame(self,text='big box containing the small one') 
     self.graphStuff = tki.Entry(self.box) # something graphical 
     self.sbox = SmallBox(self) 
     self.graphStuff.grid() 
     self.box.grid() 
     self.sbox.grid() 

if __name__ == '__main__': 
    tg = BigBox(None) 
    tg.mainloop() 

Мы не находим (особенно для французских людей, или, может быть, люди не «естественны» на английском языке) многие примеры и документы, и тот, который я использую, довольно распространен, так что, возможно, это будет полезно кому-то.

+0

Ваш пример хороший, но вы должны явно создать корневое окно и передать это как первый параметр в «BigBox» (например: «root = Tk(); tg = BigBox (root)») –

+0

Ок, Я сохраню это. Поэтому, если я это понимаю, когда я перехожу на Tk в Frame, я должен теперь создать объект Tk() и передать его в качестве родителя для моего основного фрейма. –

+0

Да, это правильно. –

1

У учебника, которое вы используете, приведен неверный пример. Класс Tk не имеет родителя.

Также вы должны создать только один экземпляр Tk (или подкласс Tk). Виджеты Tkinter существуют в древовидной иерархии с одним корнем. Этот корневой виджет - Tk(). У вас не может быть более одного корня.

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