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()