【问题标题】:Tkinter scrollbar for frame in a Frame框架中框架的 Tkinter 滚动条
【发布时间】:2019-06-27 13:18:14
【问题描述】:

我正在创建一个可以在帧之间更改的动态容器。在其中一个框架中,我有一个需要滚动浏览的值列表,因为它太长了。但是我无法让滚动条与画布和框架设置一起使用。

我尝试过使用 Listbox,它可以工作,但不能让我控制我正在寻找的显示。我希望能够配置标签的名称,然后在右侧配置值。

#!Python
import matplotlib
matplotlib.use("TkAgg")

from matplotlib import style

import tkinter as tk
from tkinter import *

from YahooParser import Yahoo_Parser

TITLE_FONT = ("Helvetica", 10, "bold")
LARG_FONT = ("Helvetica", 12)
NORM_FONT = ("Helvetica", 10)
AIR_FONT = ("Arial", 10)
SMALL_FONT = ("Helvetica", 8)
style.use("ggplot")
#style.use("ggplot")

Gray = "#%02x%02x%02x" % (85, 85, 85)
Wight ="#%02x%02x%02x" % (220, 220, 220)


class Midas_Screen(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        # Title
        tk.Tk.wm_title(self, "Midas Program")
        tk.Tk.geometry(self,"500x400")
        #tk.Tk.configure(self, background='black')

        # This set the seting for the container
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        # Makes all the frames and stores them
        for F in (HomePage,):

            # You pass the container to your page function. this makes the frame
            frame = F(container, self)
            # this aligns the frame "nsew" = North, South etc
            frame.grid(row=0, column=0, sticky="nsew")
            # This uses the function as a key in the dic
            self.frames[F] = frame

        self.show_frame(HomePage)


    def show_frame(self, key):
        frame = self.frames[key]
        frame.tkraise()


class HomePage(tk.Frame):

    def __init__(self, perent, controller):

        self.yp = Yahoo_Parser()
        self.names = []
        self.values = {}

        for tag in self.yp.values_sum:
            self.names.append(tag[0])
        for tag in self.yp.values_sta:
            self.names.append(tag[0])
        for tag in self.names:
            self.values[tag]='0'

        tk.Frame.__init__(self, perent)

        frame = Frame(perent)
        frame.grid(row=1, column=1)

        canvas = Canvas(frame)
        canvas.configure(scrollregion=(0,0,500,500), width=200, height=200)

        myscrollbar = Scrollbar(frame, orient="vertical")
        myscrollbar.grid(row=1, column=2, sticky="ns")
        myscrollbar.config(command=canvas.yview)

        canvas.config(yscrollcommand=myscrollbar.set)

        R = 1
        for key in self.values:
            label = tk.Label(canvas, text=key + ':', font=AIR_FONT, bg=Gray, fg=Wight, borderwidth=0,
                             relief="solid")
            value = tk.Label(canvas, text=self.values[key], font=AIR_FONT, bg=Gray, fg=Wight, borderwidth=0,
                             relief="solid")

            label.grid(row=R, column=1, sticky="nsew")
            value.grid(row=R, column=2, sticky="nsew")
            R += 1

        canvas.grid(row=1, column=1)


app = Midas_Screen()
app.mainloop()

【问题讨论】:

  • " 我无法让滚动条工作" - 这是什么意思?为什么你不能?代码的作用是什么,它与您期望它的作用有何不同?
  • 这意味着滚动条不会滚动值,因为列表太显示在屏幕上。酒吧根本行不通。此代码有效:stackoverflow.com/questions/16188420/… 我希望我的酷也能类似地工作
  • 您的代码与该问题中的代码完全不同。

标签: python-3.x tkinter scrollbar


【解决方案1】:

画布无法滚动使用grid 添加到画布的内容。最常见的解决方案是用create_window在画布上添加一个框架,然后在框架上添加标签。

Adding a scrollbar to a group of widgets in Tkinter

【讨论】:

    【解决方案2】:

    所以我做了一些更改,谢谢并让它工作:) 再见使用包,因为你认为它有效

    #!Python
    import matplotlib
    matplotlib.use("TkAgg")
    
    from matplotlib import style
    
    import tkinter as tk
    from tkinter import *
    
    from YahooParser import Yahoo_Parser
    
    TITLE_FONT = ("Helvetica", 10, "bold")
    LARG_FONT = ("Helvetica", 12)
    NORM_FONT = ("Helvetica", 10)
    AIR_FONT = ("Arial", 10)
    SMALL_FONT = ("Helvetica", 8)
    style.use("ggplot")
    #style.use("ggplot")
    
    Gray = "#%02x%02x%02x" % (85, 85, 85)
    Wight ="#%02x%02x%02x" % (220, 220, 220)
    
    
    class Midas_Screen(tk.Tk):
    
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)
    
            # Title
            tk.Tk.wm_title(self, "Midas Program")
            tk.Tk.geometry(self,"500x400")
            #tk.Tk.configure(self, background='black')
    
            # This set the seting for the container
            container = tk.Frame(self)
            container.pack(side="top", fill="both", expand = True)
            container.grid_rowconfigure(0, weight=1)
            container.grid_columnconfigure(0, weight=1)
    
            self.frames = {}
    
            # Makes all the frames and stores them
            for F in (HomePage,):
    
                # You pass the container to your page function. this makes the frame
                frame = F(container, self)
                # this aligns the frame "nsew" = North, South etc
                frame.grid(row=1, column=1, sticky="nsew")
                # This uses the function as a key in the dic
                self.frames[F] = frame
    
            self.show_frame(HomePage)
    
    
        def show_frame(self, key):
            frame = self.frames[key]
            frame.tkraise()
    
    
    class HomePage(tk.Frame):
    
        def __init__(self, perent, controller):
    
            self.values = {}
    
            for tag in range(20):
                self.values['Text'+str(tag)+':']='0'
    
            tk.Frame.__init__(self, perent)
    
            def myfunction(event):
                canvas.configure(scrollregion=canvas.bbox("all"), width=200, height=200)
    
            canvas = Canvas(perent)
            frame = Frame(canvas)
    
            myscrollbar = Scrollbar(frame, orient="vertical", command=canvas.yview)
            canvas.config(yscrollcommand=myscrollbar.set)
    
            myscrollbar.pack(side=RIGHT, fill=Y)# sticky="ns")
            canvas.grid(row=0, column=0, sticky="nw")
            #canvas.pack(side=LEFT)
            canvas.create_window((0, 0), window=frame, anchor='nw')
    
    
            R = 1
            for key in self.values:
                row = Frame(frame)
                label = tk.Label(row, text=key + ':', font=AIR_FONT, bg=Gray, fg=Wight, borderwidth=0,
                                 relief="solid")
                value = tk.Label(row, text=self.values[key], font=AIR_FONT, bg=Gray, fg=Wight, borderwidth=0,
                                 relief="solid")
    
                label.pack(side=LEFT, fill=X)
                value.pack(side=LEFT,fill=X)
                row.pack(side=TOP, fill=X)
                R += 1
    
            frame.bind("<Configure>", myfunction)
    
    
    app = Midas_Screen()
    app.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多