Tkinter:从纯网格迁移到 frame-in-canvas 结构
Tkinter: Migrating from purely grid to frame-in-canvas structure
到目前为止,我的代码是使用纯网格结构来放置按钮和文本,但这不允许我放置垂直滚动条。我需要更改我的代码以将其放入具有框架的 canvas 中,然后框架需要按钮+文本并且 canvas 需要有一个垂直滚动条。
代码如下:
import tkinter as tk
from pixelregex import regex
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.num_snippets = 1
self.initialize()
def initialize(self):
self.grid()
self.entryVariable = tk.StringVar()
# Just some buttons on the window
button_start = tk.Button(self, text=u"Start", command=self.onStart)
button_start.grid(row=0, column=0, sticky="EW")
button_reset = tk.Button(self, text=u"Quit", command=self.onReset)
button_reset.grid(row=0, column=1, sticky="EW")
self.entry = tk.Entry(self, textvariable=self.entryVariable)
self.entry.grid(row=0, column=2, sticky="EW")
self.columnconfigure(1, weight=1)
def onStart(self):
# Get the value entered in the Entry widget
dim = self.entryVariable.get()
try:
dim = int(dim)
except ValueError:
dim = 2 # Default
print("Non integral dimension as input. Setting it to two ..")
# FUnction that returns a list having 4 strings
reg = regex.getRegex(dim)
row_num = str(self.num_snippets)
snippet_id = tk.Label(self, text=row_num, anchor="w", fg="blue", bg="white")
snippet_id.grid(column=0, row=self.num_snippets, columnspan=1, sticky='EW')
text = tk.Text(self, width=100, height=10)
text.grid(row=self.num_snippets, column=1, columnspan=2, sticky="EW")
input_string = "Top: " + reg[0] + "\n\n" + "Bottom: " + reg[1] + "\n\n" + "Left: " + reg[
2] + "\n\n" + "Right: " + reg[3] + "\n\n"
text.insert('1.0', input_string)
self.num_snippets += 1
def onReset(self):
self.destroy()
pass
我尝试制作一个 canvas,在其中放置一个框架,使用该框架使用 grid() 插入按钮,但 canvas 仍然是空的!我还需要插入一个垂直滚动条。
非常感谢您的帮助。
您不需要为此使用 canvas。您可以只使用框架和滚动条。
这是在文本框上使用垂直滚动条的示例。
据我所知,您唯一需要使用带有滚动条的 canvas 的情况是,如果您有多个框架或多个小部件,您希望同时滚动所有这些小部件。
这里是设置 Y 轴滚动条的方法。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.btnframe = tk.Frame(self)
self.btnframe.grid(row = 0, column = 0)
self.textframe = tk.Frame(self)
self.textframe.grid(row = 0, column = 1, sticky = "nsew")
self.textframe.columnconfigure(0, weight=1)
self.textframe.columnconfigure(1, weight=0)
self.textframe.rowconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.rowconfigure(0, weight=1)
button_start = tk.Button(self.btnframe, text=u"Start", command=self.onStart)
button_start.grid(row=0, column=0, sticky="n")
button_reset = tk.Button(self.btnframe, text=u"Quit", command=self.onReset)
button_reset.grid(row=0, column=1, sticky="n")
self.text = tk.Text(self.textframe, width = 10, height = 10)
self.text.grid(row=0, column=0, sticky="nsew")
self.v_scroll_bar = tk.Scrollbar(self.textframe)
self.v_scroll_bar.grid(row = 0, column = 1, sticky = 'nse')
self.v_scroll_bar.config(command = self.text.yview)
def onStart(self):
for num in range(100):
self.text.insert("end","{}{}".format(num, "\n"))
self.text.see("end")
def onReset(self):
self.destroy()
pass
if __name__ == "__main__":
MyApp = App()
tk.mainloop()
到目前为止,我的代码是使用纯网格结构来放置按钮和文本,但这不允许我放置垂直滚动条。我需要更改我的代码以将其放入具有框架的 canvas 中,然后框架需要按钮+文本并且 canvas 需要有一个垂直滚动条。
代码如下:
import tkinter as tk
from pixelregex import regex
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.num_snippets = 1
self.initialize()
def initialize(self):
self.grid()
self.entryVariable = tk.StringVar()
# Just some buttons on the window
button_start = tk.Button(self, text=u"Start", command=self.onStart)
button_start.grid(row=0, column=0, sticky="EW")
button_reset = tk.Button(self, text=u"Quit", command=self.onReset)
button_reset.grid(row=0, column=1, sticky="EW")
self.entry = tk.Entry(self, textvariable=self.entryVariable)
self.entry.grid(row=0, column=2, sticky="EW")
self.columnconfigure(1, weight=1)
def onStart(self):
# Get the value entered in the Entry widget
dim = self.entryVariable.get()
try:
dim = int(dim)
except ValueError:
dim = 2 # Default
print("Non integral dimension as input. Setting it to two ..")
# FUnction that returns a list having 4 strings
reg = regex.getRegex(dim)
row_num = str(self.num_snippets)
snippet_id = tk.Label(self, text=row_num, anchor="w", fg="blue", bg="white")
snippet_id.grid(column=0, row=self.num_snippets, columnspan=1, sticky='EW')
text = tk.Text(self, width=100, height=10)
text.grid(row=self.num_snippets, column=1, columnspan=2, sticky="EW")
input_string = "Top: " + reg[0] + "\n\n" + "Bottom: " + reg[1] + "\n\n" + "Left: " + reg[
2] + "\n\n" + "Right: " + reg[3] + "\n\n"
text.insert('1.0', input_string)
self.num_snippets += 1
def onReset(self):
self.destroy()
pass
我尝试制作一个 canvas,在其中放置一个框架,使用该框架使用 grid() 插入按钮,但 canvas 仍然是空的!我还需要插入一个垂直滚动条。
非常感谢您的帮助。
您不需要为此使用 canvas。您可以只使用框架和滚动条。
这是在文本框上使用垂直滚动条的示例。
据我所知,您唯一需要使用带有滚动条的 canvas 的情况是,如果您有多个框架或多个小部件,您希望同时滚动所有这些小部件。
这里是设置 Y 轴滚动条的方法。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.btnframe = tk.Frame(self)
self.btnframe.grid(row = 0, column = 0)
self.textframe = tk.Frame(self)
self.textframe.grid(row = 0, column = 1, sticky = "nsew")
self.textframe.columnconfigure(0, weight=1)
self.textframe.columnconfigure(1, weight=0)
self.textframe.rowconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.rowconfigure(0, weight=1)
button_start = tk.Button(self.btnframe, text=u"Start", command=self.onStart)
button_start.grid(row=0, column=0, sticky="n")
button_reset = tk.Button(self.btnframe, text=u"Quit", command=self.onReset)
button_reset.grid(row=0, column=1, sticky="n")
self.text = tk.Text(self.textframe, width = 10, height = 10)
self.text.grid(row=0, column=0, sticky="nsew")
self.v_scroll_bar = tk.Scrollbar(self.textframe)
self.v_scroll_bar.grid(row = 0, column = 1, sticky = 'nse')
self.v_scroll_bar.config(command = self.text.yview)
def onStart(self):
for num in range(100):
self.text.insert("end","{}{}".format(num, "\n"))
self.text.see("end")
def onReset(self):
self.destroy()
pass
if __name__ == "__main__":
MyApp = App()
tk.mainloop()