Пользовательский Python tkinter GUI класс / функция-обертка не работает в каждом случае. - PullRequest
0 голосов
/ 31 марта 2012

Я попытался создать какую-нибудь оболочку / класс, чтобы сделать графический интерфейс с tkinter несколько проще.Я понимаю, что это отчасти избыточно и не делает код намного красивее или меньше, но я просто хотел попробовать, смогу ли я это сделать.Вот мой код.

#!/usr/bin/env
from tkinter import *
import tkinter.messagebox

class Bysic():
def __init__(self):
    self.app = Tk()

def createButton(self, label, row, col, command, sticky=W):
    self.button = Button(self.app,text=label,command=command)
    self.button.grid(row=row, column=col, sticky=sticky)

def setSize(self, width, height):
    self.app.geometry(str(width)+"x"+str(height))

def setTitle(self, title):
    self.app.title(title)

def createEntry(self, caption, row, col, width=None, defaultValue=None, alignment=W, **options):
    self.entryLabel = Label(self.app, text=caption)
    self.entryLabel.grid(row=row, column=col, sticky=W)
    self.entry = Entry(self.app, **options)
    if defaultValue:
        self.entry.delete(0, END)
        self.entry.insert(0, defaultValue)
    if width:
        self.entry.config(width=width)
    self.entry.grid(row=row, column=col+1, sticky=W)
    return self.entry

def createLabelVar(self, caption, row, col, alignment=W):
    self.labelVar = StringVar()
    self.labelVar.set(caption)
    self.label = Label(self.app, textvar=self.labelVar)
    self.label.grid(row=row, column=col, sticky=alignment)
    return self.labelVar

def createLabel(self, caption, row, col, alignment=W):
    self.staticLabel = Label(self.app, text=caption)
    self.staticLabel.grid(row=row, column=col, sticky=alignment)

def appLoop(self):
    self.app.mainloop()

def appKill(self):
    self.app.destroy()

Теперь я могу создать экземпляр объекта Bysic и вызвать на нем элементы GUI.Однако один элемент createLabelVar работает только на первом графическом интерфейсе.Позвольте мне продемонстрировать это.

import bysic
x = Bysic()
label = x.createLabelVar("Original text",0,0)
label.set("Overriding text")

a = Bysic()
newLabel = a.createLabelVar("Original text",0,0)
newLabel.set("Override")

Первый экземпляр Bysic (x) действительно показывает метку с текстом «Перезаписывающий текст», однако второй экземпляр Bysic (a) ничего не показывает, просто пустой tkinterокно.

Как получается?Я имею в виду, x и a разделены, почему функция createLabelVar работает с одним экземпляром, но не с другим?

Заранее спасибо!

1 Ответ

0 голосов
/ 01 апреля 2012

Tkinter не предназначен для использования более одного экземпляра класса Tk. Вы должны создать только один и запустить только один mainloop.

Если вам нужно несколько окон, вам нужно создать экземпляры Toplevel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...