【问题标题】:How to move a scroll bar canvas/frame without making the scroll bar grey如何在不使滚动条变灰的情况下移动滚动条画布/框架
【发布时间】:2014-12-13 22:32:49
【问题描述】:

我目前正在为我的计算机课程编写一些东西,我正在尝试将滚动条加入其中,目前我找不到任何网站可以真正解释为什么在移动窗口框架后,滚动条停止工作(变成变灰)并且在移动窗口的画布后,画布变得非常小(不是我想要的大小)。下面是一些示例代码:

import Tkinter as tk
from Tkinter import *
master.geometry("800x600+300+150")


class Example(tk.Frame):
def main(self):

    self.canvas = tk.Canvas(master, borderwidth=0, background="#ffffff")
    self.frame = tk.Frame(self.canvas, background="#ffffff")
    self.vsb = tk.Scrollbar(self.canvas, orient="vertical", command=self.canvas.yview)
    self.hsb = tk.Scrollbar(self.canvas, orient="horizontal", command=self.canvas.xview)
    self.canvas.configure(yscrollcommand=self.vsb.set)
    self.canvas.configure(xscrollcommand=self.hsb.set)

    self.vsb.pack(side="right", fill="y")
    self.hsb.pack(side="bottom", fill="x")
    self.canvas.pack(side="left", fill="both", expand=True)
    self.canvas.create_window((4,4), window=self.frame, anchor="nw",
                              tags="self.frame")

    self.frame.bind("<Configure>", self.OnFrameConfigure)

    self.populate()

def populate(self):
    vars1 = StringVar()
    vars1.set("junk")
    for i in range(100):
        tk.Entry(self.frame, text=vars1).grid(row=1*i, column=1)

def OnFrameConfigure(self, event):
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))

dave3 = Example()
dave3.main()


button = Button(master, text="Hi").place(x=0, y=0)

mainloop()

如果我尝试移动框架或画布,我不想移动框架或画布,我只是希望整个框架向下移动,这样按钮就不会与画布条目重叠,并且滚动条仍然可以工作.如果有人可以解决这个问题,我将非常感激,干杯。

感谢 Bryan Oakley 用他的示例代码让我走到这一步。

【问题讨论】:

  • “移动框架或画布”是什么意思?你的意思是你只是给它不同的包装选项,或者给它一个不同的父母?执行其中任何一个都不应该影响滚动条。
  • 对不起,我对 Python 比较陌生,所以我并不完全熟悉与它相关的技术术语,我基本上希望滚动条区域只是屏幕的一小部分,就像一个窗口一个窗户里面。在我的实际项目中,我在顶部有一个菜单栏,我希望整个滚动条区域都在它下面,而不是在它上面。在这里,如果我尝试将“.place”与框架一起使用,它会使滚动条变灰并使它们无用,所以我的问题是,我必须做什么才能将框架移动到示例按钮“Hi”下方并且仍然有滚动条在职的?干杯。

标签: python canvas tkinter scrollbar


【解决方案1】:

好吧,没关系,我只是想通了,我需要做的是创建另一个框架并将前一个框架放入该框架中。在此之后,我只是将该框架配置为我需要的大小。对于任何其他新手,这是代码:

import Tkinter as tk
from Tkinter import *
master = Tk()
master.geometry("800x600+300+150")

class Example(tk.Frame):
    def main(self):

        self.framee = tk.Frame(master,background="red")
        self.canvas = tk.Canvas(self.framee, borderwidth=0, background="#ffffff")
        self.frame = tk.Frame(self.canvas, background="#ffffff")
        self.vsb = tk.Scrollbar(self.canvas, orient="vertical", command=self.canvas.yview)
        self.hsb = tk.Scrollbar(self.canvas, orient="horizontal", command=self.canvas.xview)
        self.canvas.configure(yscrollcommand=self.vsb.set)
        self.canvas.configure(xscrollcommand=self.hsb.set)

        self.vsb.pack(side="right", fill="y")
        self.hsb.pack(side="bottom", fill="x")
        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((4,4), window=self.frame, anchor="nw",
                                  tags="self.frame")

        self.frame.bind("<Configure>", self.OnFrameConfigure)
        self.framee.place(x=0, y=50, width=500, height=500)
        self.populate()

    def populate(self):
        vars1 = StringVar()
        vars1.set("junk")
        for i in range(100):
            tk.Entry(self.frame, text=vars1).grid(row=1*i, column=1)

    def OnFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

dave3 = Example()
dave3.main()


button = Button(master, text="Hi").place(x=0, y=0)

mainloop()

【讨论】:

  • 如果你刚刚学习 Tkinter,我强烈建议你使用 pack 或 grid 代替 place。这两个使制作易于维护并具有适当调整大小行为的 GUI 变得更加容易。地点通常只适用于一些非常具体的情况。
猜你喜欢
  • 2013-09-23
  • 2011-08-17
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2022-12-17
相关资源
最近更新 更多