【问题标题】:Pack tkinter window expanding past frame打包 tkinter 窗口扩展过去的框架
【发布时间】:2017-07-20 07:36:21
【问题描述】:

我有一个我正在尝试布局的 GUI,以便添加屏幕文字以在每个方向上填充屏幕,但最多只能达到 root.geometry('300x600') 的大小

相反,它的扩展范围远远超过了框架的宽度。有什么办法可以调整大小以使其包装正确吗?到目前为止,我已经尝试了很多不起作用的东西。

编辑:要查看整个文本和滚动条,我必须设置 root.geometry('684x418)

from tkinter import *

class Rhapsody_Gui:
    def __init__(self,root):
        Window = Frame(root, width=200, height=200)

        self.InWidget = Text(Window,bg='white',bd=3,fg='black',exportselection=0,height=1,wrap=WORD,insertofftime=0,insertbackground="white")

        Window.pack()
        self.InWidget.focus_set()



        self.scroll = Scrollbar(Window, orient=VERTICAL)
        self.OutWidget = Text(Window, yscrollcommand=self.scroll.set)#, height=30)
        self.OutWidget.bind("<Button 1>",self.Select)
        self.InWidget.bind("<Return>", self.Post)
        myList = ['words', 'that', 'should', 'be', 'printed']
        for x in myList:
            self.OutWidget['state'] = ['normal']
            self.OutWidget.insert(END, x +'\n')

        self.scroll.config(command=self.OutWidget.yview)
        self.InWidget.pack(side=TOP, fill='none')
        self.OutWidget.pack(side=LEFT, fill='none', expand=False)
        self.scroll.config(command=self.OutWidget.yview)
        self.scroll.pack(side=RIGHT, fill=Y, expand=False)#, ipadx=5)
        self.OutWidget['state'] = ['disabled']

    def Post(self,event):
        text = self.InWidget.get(1.0,2.0)
        self.InWidget.delete(1.0,2.0)
        self.OutWidget['state'] = ['normal']
        self.OutWidget.insert('end',text)
        self.OutWidget['state'] = ['disabled']
        return ("break")

    def Select(self,event):
        line_start = self.OutWidget.index("@%s,%s linestart" % (event.x, event.y))
        line_end = self.OutWidget.index("%s lineend" % line_start)
        self.OutWidget.tag_configure("highlight", background="yellow")
        self.OutWidget.tag_remove("highlight", 1.0, "end")
        self.OutWidget.tag_add("highlight", line_start, line_end)
        self.InWidget.focus_set()
        return ("break")

if __name__ == '__main__':
    root = Tk()
    root.geometry('300x600+600+100')
    App = Rhapsody_Gui(root)
    root.mainloop()

这就是我想要的样子,除了一直填充到底部

【问题讨论】:

  • 您是在问如何使 Text 小部件填满窗口或使窗口缩小到 Text 小部件的大小?窗口对我来说是 600x300。添加此行以查看几何发生变化时:root.bind('&lt;Configure&gt;', lambda e: print(root.geometry()))
  • 我希望写入文本的 OutWidget 与整个窗口的大小相同。对我来说,它无形地延伸到框架的宽度之外。因此,我必须将窗口大小调整为更大才能看到滚动条或 OutWidget 文本窗口的边缘。

标签: python tkinter


【解决方案1】:

您将 OUTWidget 显式设置为 fill='none', expand=False。但从你想要的描述来看:

self.OutWidget.pack(side=LEFT, fill='both', expand=True)

你需要从一个很小的文本窗口开始,因为它只会扩大,不会缩小:

self.OutWidget = Text(Window, height=1, width=1, yscrollcommand=self.scroll.set)

并确保对包含的 Frame 执行相同的操作:

Window.pack(fill='both', expand=True)

为 Window 指定大小是没有意义的,因为一旦将任何内容打包到其中,这些设置就会被覆盖。

【讨论】:

  • 我试过设置side=LEFT,fill=BOTH,expand=True。我显然缺少的是需要设置窗口高度=1,宽度=1。出于某种原因,即使将窗口设置为填充和扩展,它也不起作用。知道为什么需要明确地将高度和宽度设置得小吗?
  • @ProfessionalNameForDisplayHere 我测试了它,它对我有用。使用您现在拥有的代码更新您的 OP,我会看看。
  • 抱歉,我的评论不清楚。它确实有效,但前提是我还指定了 height=1,width=1。没有那部分。窗口扩展超过 gui 窗口的宽度。
【解决方案2】:

使用&lt;window/parent&gt;.resizable(width=False, height=True)

【讨论】:

  • 为了使您的答案对本网站可行,您最好解释如何解决问题,而不是简单地发布盲目的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2014-10-26
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多