Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在tkinter上的一个框架中具有多个带滚动条的文本小部件_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 如何在tkinter上的一个框架中具有多个带滚动条的文本小部件

Python 如何在tkinter上的一个框架中具有多个带滚动条的文本小部件,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我希望我的文本小部件在每个文本小部件中都具有滚动条功能。我已经创建了一个画布,并在其中嵌入了一个框架,使用创建窗口。然后我将两个文本小部件放入这个框架中。我希望每个文本小部件都有一个滚动条,但是当我添加滚动条时,其中一个适合整个框架,而另一个适合框架的一半。我该如何解决这个问题 import tkinter as tk import os import tkinter.filedialog import tkinter.messagebox class Main(tk.Tk): def __

我希望我的文本小部件在每个文本小部件中都具有
滚动条
功能。我已经创建了一个
画布
,并在其中嵌入了一个
框架
,使用
创建窗口
。然后我将两个文本小部件放入这个框架中。我希望每个文本小部件都有一个滚动条,但是当我添加滚动条时,其中一个适合整个框架,而另一个适合框架的一半。我该如何解决这个问题

import tkinter as tk
import os
import tkinter.filedialog
import tkinter.messagebox

class Main(tk.Tk):

def __init__(self, *args, **kwargs):
    '''This initialisation runs the whole program'''
    #textBoxList = []

    tk.Tk.__init__(self, *args, **kwargs)
    self.title('Untitled')
    self.geometry('500x500')
    self.canvas = tk.Canvas(self)
    self.scroll = tk.Scrollbar(self, orient='vertical', command=self.canvas.yview)
    self.canvas.configure(yscrollcommand=self.scroll.set)
    self.frame = tk.Frame(self.canvas) # frame does not get pack() as it needs to be embedded into canvas throught canvas.
    self.scroll.pack(side='right', fill='y')
    self.canvas.pack(fill='both', expand='yes')
    self.canvas.create_window((0,0), window=self.frame, anchor='nw')
    self.frame.bind('<Configure>', self.canvas.configure(scrollregion=self.canvas.bbox('all')))

    # 1st Text Widget
    self.journal = tk.Text(self.frame)
    self.vsb = tk.Scrollbar(self.frame)
    self.vsb.config(command=self.journal.yview)
    self.journal.config(yscrollcommand=self.vsb.set)
    self.vsb.pack(side='right', fill='y')
    self.journal.pack()

    #2nd Text Widget
    self.good = tk.Text(self.frame)
    self.vsb2 = tk.Scrollbar(self.frame)
    self.vsb2.config(command=self.good.yview)
    self.good.config(yscrollcommand=self.vsb2.set)
    self.vsb2.pack(side='right', fill='y')
    self.good.pack()

root = Main()
root.mainloop()
将tkinter作为tk导入
导入操作系统
导入tkinter.filedialog
导入tkinter.messagebox
主类(tk.tk):
定义初始化(self,*args,**kwargs):
''此初始化运行整个程序''
#textBoxList=[]
tk.tk.\uuuuu初始化(self,*args,**kwargs)
self.title(“无标题”)
自几何体('500x500')
self.canvas=tk.canvas(self)
self.scroll=tk.Scrollbar(self,orient='vertical',command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scroll.set)
self.frame=tk.frame(self.canvas)#frame没有获得pack(),因为它需要通过画布嵌入到画布中。
self.scroll.pack(side='right',fill='y')
self.canvas.pack(fill='both',expand='yes')
self.canvas.create_window((0,0),window=self.frame,anchor='nw')
self.frame.bind(“”,self.canvas.configure(scrollregion=self.canvas.bbox('all'))
#第一个文本小部件
self.journal=tk.Text(self.frame)
self.vsb=tk.Scrollbar(self.frame)
self.vsb.config(命令=self.journal.yview)
self.journal.config(yscrollcommand=self.vsb.set)
self.vsb.pack(side='right',fill='y')
self.journal.pack()
#第二个文本小部件
self.good=tk.Text(self.frame)
self.vsb2=tk.Scrollbar(self.frame)
self.vsb2.config(命令=self.good.yview)
self.good.config(yscrollcommand=self.vsb2.set)
self.vsb2.pack(side='right',fill='y')
self.good.pack()
root=Main()
root.mainloop()

我不知道为什么会发生这种情况,但您可以通过为每个文本/滚动条对创建一个框架来解决这个问题

    first_text_frame = tk.Frame(self.frame)
    first_text_frame.pack()
    # 1st Text Widget
    self.journal = tk.Text(first_text_frame)
    self.vsb = tk.Scrollbar(first_text_frame)
    self.vsb.config(command=self.journal.yview)
    self.journal.config(yscrollcommand=self.vsb.set)
    self.vsb.pack(side='right', fill='y')
    self.journal.pack()

    second_text_frame = tk.Frame(self.frame)
    second_text_frame.pack()
    #2nd Text Widget
    self.good = tk.Text(second_text_frame)
    self.vsb2 = tk.Scrollbar(second_text_frame)
    self.vsb2.config(command=self.good.yview)
    self.good.config(yscrollcommand=self.vsb2.set)
    self.vsb2.pack(side='right', fill='y')
    self.good.pack()

如果希望有两个文本小部件,一个在另一个之上,每个小部件的右侧都有一个滚动条,
pack
是几何体管理器的错误选择。您应该切换到
网格
,或者使用一些内部框架使其适合

您的另一个选择是创建一个自定义类,该类是一个包含一个文本小部件和一个滚动条的框架。然后,创建该类的两个实例,并将一个实例放在另一个实例上。

两个问题(除了粘贴代码时可能出现的混乱缩进):

  • 绑定到函数的返回值,而不是函数本身。您可以使用
    lambda
    函数解决此问题
  • 您正在尝试使用
    pack()
    创建复杂布局。请尝试
    grid()
  • 将tkinter作为tk导入
    导入操作系统
    导入tkinter.filedialog
    导入tkinter.messagebox
    主类(tk.tk):
    定义初始化(self,*args,**kwargs):
    ''此初始化运行整个程序''
    #textBoxList=[]
    tk.tk.\uuuuu初始化(self,*args,**kwargs)
    self.title(“无标题”)
    自几何体('500x500')
    self.canvas=tk.canvas(self)
    self.scroll=tk.Scrollbar(self,orient='vertical',command=self.canvas.yview)
    self.canvas.configure(yscrollcommand=self.scroll.set)
    self.frame=tk.frame(self.canvas)#frame没有获得pack(),因为它需要通过画布嵌入到画布中。
    self.scroll.pack(side='right',fill='y')
    self.canvas.pack(fill='both',expand='yes')
    self.canvas.create_window((0,0),window=self.frame,anchor='nw')
    self.frame.bind(“”,lambda x:self.canvas.configure(scrollregion=self.canvas.bbox('all'))#lambda函数
    #第一个文本小部件
    self.journal=tk.Text(self.frame)
    self.vsb=tk.Scrollbar(self.frame)
    self.vsb.config(命令=self.journal.yview)
    self.journal.config(yscrollcommand=self.vsb.set)
    self.journal.grid(行=0,列=0)#改为grid
    self.vsb.grid(行=0,列=1,sticky='ns')#grid
    #第二个文本小部件
    self.good=tk.Text(self.frame)
    self.vsb2=tk.Scrollbar(self.frame)
    self.vsb2.config(命令=self.good.yview)
    self.good.config(yscrollcommand=self.vsb2.set)
    self.good.grid(行=1,列=0)#改为grid
    self.vsb2.grid(行=1,列=1,sticky='ns')#grid
    root=Main()
    root.mainloop()
    
    如果没有答案很难回答。很抱歉,我编辑了代码,使之成为MCVEThanks,您是否可以扩展问题1,因为我不太理解:a)帧如何绑定到返回值b)提供lambda如何使其绑定到函数而不是函数请参阅了解更多信息。基本上,
    multiply(2,3)
    不是一个函数,它只是数字
    6
    lambda
    关键字定义函数,基本上用作包装器。
    import tkinter as tk
    import os
    import tkinter.filedialog
    import tkinter.messagebox
    
    class Main(tk.Tk):
    
        def __init__(self, *args, **kwargs):
            '''This initialisation runs the whole program'''
            #textBoxList = []
    
            tk.Tk.__init__(self, *args, **kwargs)
            self.title('Untitled')
            self.geometry('500x500')
            self.canvas = tk.Canvas(self)
            self.scroll = tk.Scrollbar(self, orient='vertical', command=self.canvas.yview)
            self.canvas.configure(yscrollcommand=self.scroll.set)
            self.frame = tk.Frame(self.canvas) # frame does not get pack() as it needs to be embedded into canvas throught canvas.
            self.scroll.pack(side='right', fill='y')
            self.canvas.pack(fill='both', expand='yes')
            self.canvas.create_window((0,0), window=self.frame, anchor='nw')
            self.frame.bind('<Configure>', lambda x: self.canvas.configure(scrollregion=self.canvas.bbox('all'))) # lambda function
    
            # 1st Text Widget
            self.journal = tk.Text(self.frame)
            self.vsb = tk.Scrollbar(self.frame)
            self.vsb.config(command=self.journal.yview)
            self.journal.config(yscrollcommand=self.vsb.set)
            self.journal.grid(row=0, column=0) # grid instead
            self.vsb.grid(row=0, column=1, sticky='ns') # grid instead
    
            #2nd Text Widget
            self.good = tk.Text(self.frame)
            self.vsb2 = tk.Scrollbar(self.frame)
            self.vsb2.config(command=self.good.yview)
            self.good.config(yscrollcommand=self.vsb2.set)
            self.good.grid(row=1, column=0) # grid instead
            self.vsb2.grid(row=1, column=1, sticky='ns') # grid instead
    
    root = Main()
    root.mainloop()