просто холст в окне tkinter - PullRequest
       19

просто холст в окне tkinter

0 голосов
/ 11 ноября 2010

Если я пытаюсь поместить холст в окно tkinter и ничего больше с этим кодом:

from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
class Application(Frame):
    def createWidgets(self):
        self.can = Canvas(self.master, width=500, height=250)
        self.can.grid(row=2, column=1)
        self.can.create_line(0,0,500,200)
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

окно никогда не создается.Я обнаружил, что добавление кнопки для создания холста работает:

from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
class Application(Frame):
    def makecanvas(self):
        self.grid_forget()
        self.can = Canvas(self.master, width=500, height=250)
        self.can.grid(row=2, column=1)
        self.can.create_line(0,0,500,200)
    def createWidgets(self):
        self.inst = Button(self)
        self.inst["text"] = "GO!"
        self.inst["command"] =  self.makecanvas           
        self.inst.grid(row=3, column=1, pady=15, sticky=N)
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

Кроме того, если я закомментирую функцию создания холста, кнопка, которую я удалил с помощью self.grid_forget (), не исчезнет.Есть ли лучший способ сделать это?

1 Ответ

6 голосов
/ 11 ноября 2010

Проблема в том, что вы смешиваете менеджеры геометрии в одном окне.Вы можете использовать только один в данном родительском виджете.Вы можете использовать оба в вашем приложении в целом, но вы используете оба в виджетах, которые имеют одного и того же родителя.

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

Использование grid Диспетчер геометрии

from tkinter import ttk
from tkinter import *
from tkinter.ttk import *


class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()      
        self.createWidgets()

    def createWidgets(self):
        self.can = Canvas(self.master, width=500, height=250)
        self.can.grid(row=2, column=1)
        self.can.create_line(0,0,500,200)

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

Или используя pack менеджер геометрии

from tkinter import ttk
from tkinter import *
from tkinter.ttk import *


class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.can = Canvas(self.master, width=500, height=250)
        self.can.pack()
        self.can.create_line(0,0,500,200)

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()
...