将网格与 ttk 小部件一起使用时崩溃
crashes when using grid with ttk widgets
我在 python 2.7 上使用 Tkinter/ttk 制作的 gui 需要一个特定的布局,这就是为什么我想使用网格定位器来掌握我的 ttk 小部件的相对位置。但是每次我 运行 我的代码,什么都没有出现。
ps:我将一些小部件与 grid() 一起使用,而另一些小部件与 pack()
不知道哪里出了问题!这是代码:
from Tkinter import *
import ttk
master = Tk()
f4=Frame(master,width=300,height=300,bg="powder blue",relief=SUNKEN)
f4.pack(side=BOTTOM,fill=BOTH, expand=True)
test = True
f3=Frame(master,width=300,height=300,bg="red",relief=SUNKEN)
f3.pack(side=TOP,fill=BOTH, expand=True)
def create():
global test
if test:
global e
e = ttk.Entry(f4).grid(row=2,column=0, columnspan=2)
test = False
#e.focus_set()
def callback():
print e.get()
b = Button(master, text="get", width=10, command=callback)
b.grid(row=0, column=0)
c = Button(master, text="set", width=10, command=callback)
c.grid(row=0, column=1)
create()
mainloop()
您的问题是在 master
window.
上同时使用 pack()
和 grid()
每个容器使用一个或另一个。
一个容器是主要的root
window,一个Toplevel()
window或者一个Frame
.
在没有 pack()
的情况下尝试这样的事情:
from Tkinter import *
import ttk
master = Tk()
master.rowconfigure(0, weight=1)
master.columnconfigure(0, weight=1)
master.columnconfigure(1, weight=1)
f3=Frame(master,width=300,height=300,bg="red",relief=SUNKEN)
f3.grid(row=0, column=0, columnspan=2, sticky="nsew")
f4=Frame(master, width=300, height=300, bg="powder blue", relief=SUNKEN)
f4.grid(row=1, column=0, columnspan=2, sticky="nsew")
test = True
def create():
global test
if test:
global e
e = ttk.Entry(f4).grid(row=2,column=0, columnspan=2)
test = False
def callback():
print e.get()
b = Button(master, text="get", width=10, command=callback)
b.grid(row=2, column=0, sticky="e")
c = Button(master, text="set", width=10, command=callback)
c.grid(row=2, column=1, sticky="w")
create()
master.mainloop()
这里是一个只使用 pack()
的版本。
我对它进行了一些改动以提供可能更接近您正在尝试的不同布局。
from Tkinter import *
import ttk
master = Tk()
f3 = Frame(master, width=300, height=300, bg="red", relief=SUNKEN)
f3.pack(side=TOP, fill=BOTH, expand=True)
f4 = Frame(master, width=300, height=300, bg="powder blue", relief=SUNKEN)
f4.pack(side=TOP, fill=BOTH)
f5 = Frame(master, width=300)
f5.pack(side=BOTTOM, fill=BOTH)
test = True
def create():
global test
if test:
global e
e = ttk.Entry(f4).pack(side=TOP,fill=BOTH)
test = False
def callback():
print e.get()
b = Button(f5, text="get", width=10, command=callback)
b.pack(side=LEFT, fill=BOTH, expand=True)
c = Button(f5, text="set", width=10, command=callback)
c.pack(side=RIGHT, fill=BOTH, expand=True)
create()
master.mainloop()
我在 python 2.7 上使用 Tkinter/ttk 制作的 gui 需要一个特定的布局,这就是为什么我想使用网格定位器来掌握我的 ttk 小部件的相对位置。但是每次我 运行 我的代码,什么都没有出现。
ps:我将一些小部件与 grid() 一起使用,而另一些小部件与 pack()
不知道哪里出了问题!这是代码:
from Tkinter import *
import ttk
master = Tk()
f4=Frame(master,width=300,height=300,bg="powder blue",relief=SUNKEN)
f4.pack(side=BOTTOM,fill=BOTH, expand=True)
test = True
f3=Frame(master,width=300,height=300,bg="red",relief=SUNKEN)
f3.pack(side=TOP,fill=BOTH, expand=True)
def create():
global test
if test:
global e
e = ttk.Entry(f4).grid(row=2,column=0, columnspan=2)
test = False
#e.focus_set()
def callback():
print e.get()
b = Button(master, text="get", width=10, command=callback)
b.grid(row=0, column=0)
c = Button(master, text="set", width=10, command=callback)
c.grid(row=0, column=1)
create()
mainloop()
您的问题是在 master
window.
pack()
和 grid()
每个容器使用一个或另一个。
一个容器是主要的root
window,一个Toplevel()
window或者一个Frame
.
在没有 pack()
的情况下尝试这样的事情:
from Tkinter import *
import ttk
master = Tk()
master.rowconfigure(0, weight=1)
master.columnconfigure(0, weight=1)
master.columnconfigure(1, weight=1)
f3=Frame(master,width=300,height=300,bg="red",relief=SUNKEN)
f3.grid(row=0, column=0, columnspan=2, sticky="nsew")
f4=Frame(master, width=300, height=300, bg="powder blue", relief=SUNKEN)
f4.grid(row=1, column=0, columnspan=2, sticky="nsew")
test = True
def create():
global test
if test:
global e
e = ttk.Entry(f4).grid(row=2,column=0, columnspan=2)
test = False
def callback():
print e.get()
b = Button(master, text="get", width=10, command=callback)
b.grid(row=2, column=0, sticky="e")
c = Button(master, text="set", width=10, command=callback)
c.grid(row=2, column=1, sticky="w")
create()
master.mainloop()
这里是一个只使用 pack()
的版本。
我对它进行了一些改动以提供可能更接近您正在尝试的不同布局。
from Tkinter import *
import ttk
master = Tk()
f3 = Frame(master, width=300, height=300, bg="red", relief=SUNKEN)
f3.pack(side=TOP, fill=BOTH, expand=True)
f4 = Frame(master, width=300, height=300, bg="powder blue", relief=SUNKEN)
f4.pack(side=TOP, fill=BOTH)
f5 = Frame(master, width=300)
f5.pack(side=BOTTOM, fill=BOTH)
test = True
def create():
global test
if test:
global e
e = ttk.Entry(f4).pack(side=TOP,fill=BOTH)
test = False
def callback():
print e.get()
b = Button(f5, text="get", width=10, command=callback)
b.pack(side=LEFT, fill=BOTH, expand=True)
c = Button(f5, text="set", width=10, command=callback)
c.pack(side=RIGHT, fill=BOTH, expand=True)
create()
master.mainloop()