【问题标题】:(Python) Inserting Frame into Canvas with scrollbar(Python) 使用滚动条将框架插入画布
【发布时间】:2017-12-21 21:00:41
【问题描述】:

我正在尝试获取一个框架并将其插入具有滚动条的画布中,因为数据不完全适合它自己的窗口。这是我编写框架的代码,但不知道如何将其放入画布并正确编写滚动条以位于窗口的右侧:

    class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        b = tk.Button(self, text="Done!", command=self.upload_cor)
        b.grid()
        table = tk.Frame(self, width=300, height=300)
        table.grid(row=0,column=0)

        canvas=Canvas(table,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))
        vbar=Scrollbar(table,orient=VERTICAL)
        vbar.pack(side=RIGHT,fill=Y)
        vbar.config(command=canvas.yview)
        canvas.config(width=300,height=300)
        canvas.config(yscrollcommand=vbar.set)
        canvas.pack(side=LEFT,expand=True,fill=BOTH)

        data = (word_freq)

        self.widgets = {}
        row = 0
        for word, freq in (data):
            row += 1
            self.widgets[word] = {
                "Word": tk.Label(table, text=word),
                "Freq": tk.Label(table, text=freq),
                "checkbox_var": tk.IntVar(),
                "checkbox": tk.Checkbutton(table)
            }

            self.widgets[word]["Word"].grid(row=row, column=1, sticky="nsew")
            self.widgets[word]["Freq"].grid(row=row, column=2, sticky="nsew")

            self.widgets[word]["checkbox"].config(variable=(self.widgets[word]["checkbox_var"]))
            self.widgets[word]["checkbox"].grid(row=row, column=7, sticky="nsew")

        table.grid_columnconfigure(1, weight=1)
        table.grid_columnconfigure(2, weight=1)
        # invisible row after last row gets all extra space
        table.grid_rowconfigure(row+1, weight=1)

    def upload_cor(self):
        for word in sorted(self.widgets.keys()):
            entry_widget = self.widgets[word]["num_seconds_correction"]
            new_value = entry_widget.get()
            print("%s: %s" % (word, new_value))

        for word in sorted(self.widgets.keys()):
            check_var = self.widgets[word]["checkbox_var"]
            print(check_var.get())
            if check_var.get():
               print('Check button checked')

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).grid(fill="both", expand=True)
    root.mainloop()

【问题讨论】:

  • This post 应该回答你的问题。
  • 我已经尝试关注该帖子,但不断收到错误消息,我觉得这是因为包含“类”和“定义”。我对 python 非常陌生,此时传输代码对我来说非常困难
  • 我不断收到此错误:_tkinter.TclError: cannot use geometry manager grid inside .!example which already has slaves managed by pack
  • 您只能在一个小部件中使用一个几何管理器。因此,如果框架中的某些小部件使用.grid() 进行管理,则使用.pack() 添加其他小部件将生成此异常。只需将包更改为网格即可。
  • 我不确定我需要准确更改哪些。我已经编辑了我的帖子以显示我所做的更改,但是更改“包”的任何组合都不会让我获得可执行代码

标签: python-3.x tkinter tkinter-canvas


【解决方案1】:

以下演示了画布和滚动条在框架内的网格化。画布包含表格框架,而表格框架又包含其他网格小部件。

class Example(tk.Frame):
def __init__(self, parent):
    tk.Frame.__init__(self, parent)
    b = tk.Button(self, text="Done!", command=self.upload_cor)
    b.grid()

    canvas=Canvas(self,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))
    vbar=Scrollbar(self,orient=VERTICAL)
    vbar.grid(row=1,column=1,sticky='nsw')
    vbar.config(command=canvas.yview)
    canvas.config(width=300,height=300)
    canvas.config(yscrollcommand=vbar.set)
    canvas.grid(row=1,column=0,sticky='news')
    table = tk.Frame(canvas, width=300, height=300)
    canvas.create_window(0,0,anchor='nw',height=300,width=300,window=table)

    data = (word_freq)

    self.widgets = {}
    row = 0
    for word, freq in (data):
        row += 1
        self.widgets[word] = {
            "Word": tk.Label(table, text=word),
            "Freq": tk.Label(table, text=freq),
            "checkbox_var": tk.IntVar(),
            "checkbox": tk.Checkbutton(table)
        }

        self.widgets[word]["Word"].grid(row=row, column=1, sticky="nsew")
        self.widgets[word]["Freq"].grid(row=row, column=2, sticky="nsew")

        self.widgets[word]["checkbox"].config(variable=(self.widgets[word]["checkbox_var"]))
        self.widgets[word]["checkbox"].grid(row=row, column=7, sticky="nsew")

    table.grid_columnconfigure(1, weight=1)
    table.grid_columnconfigure(2, weight=1)
    # invisible row after last row gets all extra space
    table.grid_rowconfigure(row+1, weight=1)

def upload_cor(self):
    for word in sorted(self.widgets.keys()):
        entry_widget = self.widgets[word]["num_seconds_correction"]
        new_value = entry_widget.get()
        print("%s: %s" % (word, new_value))

    for word in sorted(self.widgets.keys()):
        check_var = self.widgets[word]["checkbox_var"]
        print(check_var.get())
        if check_var.get():
           print('Check button checked')

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).grid(sticky='news')
    root.mainloop()

【讨论】:

    【解决方案2】:
    from tkinter import *
    pj = Tk()
    pj.geometry("500x600")
    fin = Frame(pj, width=200, height=200 )
    fin.pack()
    fin.place(x=90, y  = 50)`    
    canvas=Canvas(fin,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))
    vbar=Scrollbar(fin,orient=VERTICAL)
    vbar.pack(side=RIGHT,fill=Y)
    vbar.config(command=canvas.yview)
    canvas.config(width=300,height=300)
    canvas.config(yscrollcommand=vbar.set)
    canvas.pack(side=LEFT,expand=True,fill=BOTH)
    

    【讨论】:

    • 我尝试复制程序代码,但它存在格式问题,这可行
    猜你喜欢
    • 2014-04-21
    • 2016-06-06
    • 2017-01-18
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多