2016-03-22 16 views
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を使ってフレームの高さ/幅を検索してみましたが、これらの値はラベルとボタンを追加しても変更されませんでした。

可能/未遂ソリューション:

  • 私は、次の手順を実行して、[1] sw.subwidgets_allにフレーム2入れる:

    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) 
    

    これは、アプリケーションに対して固定された位置を許可しますが、ウィンドウは、frame1の代わりにボタンの親に対して相対的にサイズ変更されます。もう一つの欠点は、水平スクロールバーがframe1にのみ関連していることです。

  • スクロールバーの中点を見つけて、場所を使用してこれらの座標を基準にしてボタンの位置を更新します。これを達成する方法がわからず、SOソリューションを一般的に見ると、これは非効率的な方法ですこれを行う。

EDIT:これは私が考えていたものを正確ではありませんが、次のコードは、コメントで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() 
+1

スクロールウィンドウの外にボタンを置く方法は? – falsetru

+0

@falsetru私はいつも一度あなたがそれを知っていれば、どれほどシンプルなソリューションになるか驚いています。私はそれを受け入れることができるように正式な回答をしたいですか?私は質問などで作業コードを編集します。私は解決策1の後にその経路を避けた。ありがとうございました! –

答えて

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() 
1

番目のオプションは、1することができることあなたの状況を満足させますが、ボタンを削除してスクロールバーの上/下モーションに対して相対的に何度も再描画する必要があるため、計算コストがかかります。これは設計上醜いだけでなく、アプリケーションのスケーラビリティを向上させる上で障害になる可能性があります。また、アプリケーションで重大な操作が実行された場合でも予期しないバグが発生する可能性があります。

私があなたの問題を見る唯一の現実的な解決策は、上側のキャンバス(またはその下のどの領域を設定するか)とスクロール可能な領域の外に@falsetruがコメントされているようにボタンを固定することです君は。

+0

ウィンドウ内ではスクロールして何かを所定の位置に固定して見るのはまだ審美的には楽しいものではありませんが、それは間違いなく仕事です。私はfalsetruが答えを投稿するのを待つでしょう。 –

関連する問題