4

Tix を使用して、コンテンツの変更に応じてスクロール バーを自動的に作成しています。アプリケーションのコンテンツをスクロールしている間、ユーザーのビューにボタンを 1 つまたは 2 つ保持したいと考えています。Tkinter/Tix に関するこの質問をまだ見ていないので、質問したいと思います。

次のコードは、ボタンがウィンドウ内の固定ポイントにあり、スクロールされる問題のサンプルを作成します。

from Tkinter import *
import Tix
class some_GUI:
    def __init__(self, root):
        sw= Tix.ScrolledWindow(root, scrollbar=Tix.AUTO)
        sw.pack(fill=Tix.BOTH, expand=1)
        frame1 = Frame(sw.window) 
        frame1.grid(row = 0, column = 1)
        frame2 = Frame(sw.window) 
        frame2.grid(row = 0, column = 2)
        def quit():
            root.quit()
        for i in range(0,300):
            label1 = Label(frame1, text = "foo")
            label1.grid(row = i, column = 0)
        button = Button(frame2, text  = "Quit", command = quit)
        button.pack()

root = Tix.Tk()
display = some_GUI(root)
root.mainloop()

ボタンを「frame2」に配置し、アプリケーションのウィンドウに対して垂直方向に中央に配置します。winfo_height/winfo_width を使用してフレームの高さ/幅を見つけて更新しようとしましたが、ラベルとボタンを追加してもこれらの値は変わりませんでした。

試みた/可能な解決策:

  • 次のようにして、フレーム 2 を sw.subwidgets_all[1] に配置します。

    frame1.pack(side = LEFT)
    frame2 = Frame(sw.subwidgets_all()[1]) 
    frame2.pack(side = RIGHT)
    button = Button(frame2, text  = "Quit", command = quit)
    button.pack(side = RIGHT)
    

    これにより、アプリケーションに対する固定位置が可能になりますが、ウィンドウはフレーム 1 ではなくボタンの親に対してサイズ変更されます。もう 1 つの欠点は、水平スクロールバーが frame1 に対してのみ相対的であることです。

  • スクロールバーの中間点を見つけて、場所を使用してそれらの座標に関連するボタンの位置を更新します(多分?) これを達成する方法がわからず、一般的なSOソリューションを見ると、これは非効率的な方法であると思います。

編集:これは私が念頭に置いていたものとは正確には異なりますが、次のコードは、コメントのfalsetruの提案に従って機能します:

from Tkinter import *
import Tix
class some_GUI:
    def __init__(self, root):
        def quit():
            root.quit()
        frame2 = Frame(root) 
        frame2.pack(side = RIGHT)
        button = Button(frame2, text  = "Quit", command = quit)
        button.pack()
        frame1 = Frame(root) 
        frame1.pack(side = LEFT)
        sw= Tix.ScrolledWindow(frame1, scrollbar=Tix.AUTO)
        sw.pack(fill=Tix.BOTH, expand=1)
        for widget in sw.subwidgets_all():
            print widget
        for i in range(0,300):
            label1 = Label(sw.window, text = "foo")
            label1.grid(row = i, column = i)
        print root.winfo_toplevel()
        for widget in sw.subwidgets_all():
            print widget



root = Tix.Tk()
display = some_GUI(root)
root.mainloop()
4

2 に答える 2

1

ボタンを ScrollWindows の外に出すことができます:

import Tix
from Tkinter import *


def build_ui(root):
    sw = Tix.ScrolledWindow(root, scrollbar=Tix.AUTO)
    sw.pack(side=LEFT, fill=Tix.BOTH, expand=1)
    for i in range(300):
        label1 = Label(sw.window, text="foo")
        label1.grid(row=i, column=0)
    button = Button(root, text="Quit", command=root.quit)
    button.pack(side=RIGHT)


root = Tix.Tk()
build_ui(root)
root.mainloop()
于 2016-03-22T23:31:11.847 に答える