[英]Tkinter scrollbar doesn't fill frame
我正在嘗試根據用戶的分辨率更改GUI。 我對Python還是很陌生,但已經設法做到了這一點。 我正在努力尋找為什么滾動條未使用分配給它們的所有空間的原因。 這導致它們后面的框架可見。
root = Tk()
screen_height = root.winfo_screenheight()
screen_width = root.winfo_screenwidth()
h = (screen_height / 800)
w = (screen_width / 1300)
frame = ['topleft', 'topmid', 'topright',
'bottomleft', 'bottommid']
multiplier = [300, 200, 800, 500, 100]
height = [0,
Decimal(h*(multiplier[0]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(h*(multiplier[1]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(h*(multiplier[2]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(h*(multiplier[3]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(h*(multiplier[4]))
.quantize(Decimal('1.'), rounding=ROUND_UP)
]
width = [0,
Decimal(w*(multiplier[0]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(w*(multiplier[1]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(w*(multiplier[2]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(w*(multiplier[3]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(w*(multiplier[4]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
Decimal(w*(multiplier[4]))
.quantize(Decimal('1.'), rounding=ROUND_UP),
]
topleft = Frame(root,
bg = 'black', bd='3',
height = height[1], width = width[1],
relief='flat'
).grid(row = height[0], column = width[0],
rowspan = height[1], columnspan = width[1])
topmid = Frame(root,
bg = 'yellow', bd='3',
height = height[2], width = width[2],
relief='flat'
).grid(row = height[0], column = width[1],
rowspan = height[2], columnspan = width[2])
bottommid = Frame(root,
bg = 'pink', bd ='3',
height = height[5], width = width[5],
relief='flat'
).grid(row = height[2], column = width[1],
rowspan = height[5], columnspan = width[5])
bottomright = Frame(root,
bg = 'blue', bd='3',
height = height[5], width = width[5],
relief='flat'
).grid(row = height[2], column = width[1]+width[5],
rowspan = height[5], columnspan = width[5])
class file_selector:
def __init__(self):
global fs_scrollbar, fs_listbox, check
bottomleft = Frame(root,
bg = 'white', bd='3',
height = height[4], width = width[4],
relief='flat'
).grid(row= height[1], column= width[0],
rowspan= height[4], columnspan= width[4])
self.fs_scrollbar = Scrollbar(bottomleft,
orient = VERTICAL
)
self.fs_listbox = Listbox(bottomleft,
bg = 'white',
relief = 'flat',
yscrollcommand = self.fs_scrollbar.set
)
self.check = print(self.fs_listbox.curselection())
self.fs_listbox.bind('<ButtonRelease-1>', self.check)
self.fs_scrollbar['command'] = self.fs_listbox.yview
file_selector.widgets(self)
def widgets(self):
self.fs_scrollbar.grid(row = height[1], column = (width[4]-(width[4]*Decimal(0.05)).quantize(Decimal('1.'), rounding=ROUND_UP)),
rowspan = height[4], columnspan = ((width[4]*Decimal(0.05)).quantize(Decimal('1.'), rounding=ROUND_UP)),
sticky= N+E+S+W
)
for file in os.listdir(os.curdir):
if file.endswith(".txt"):
self.fs_listbox.insert(END, file)
self.fs_listbox.grid(row = height[1], column = width[0],
rowspan = height[4], columnspan = (width[4]-(width[4]*Decimal(0.05)).quantize(Decimal('1.'), rounding=ROUND_UP)),
sticky = N+E+S+W
)
class text_editor:
def __init__(self):
global te_scrollbar, te_text
topright = Frame(root,
bg = 'red', bd='3',
height = height[3], width = width[3],
relief='flat'
).grid(row=height[0], column= width[4],
rowspan= height[3], columnspan= width[3])
self.te_scrollbar = Scrollbar(topright,
orient = VERTICAL
)
self.te_text = Text(topright,
bg = 'white',
yscrollcommand = self.te_scrollbar.set
)
self.te_scrollbar['command'] = self.te_text.yview
text_editor.widgets(self)
def widgets(self):
with open('test1.txt', 'r') as self.file:
self.file = self.file.read()
self.te_scrollbar.grid(row = height[0], column = (width[4]+width[3]-(width[3]*Decimal(0.05)).quantize(Decimal('1.'), rounding=ROUND_UP)),
rowspan = height[3], columnspan = ((width[3]*Decimal(0.05)).quantize(Decimal('1.'), rounding=ROUND_UP)),
sticky = N+S
)
self.te_text.insert(END, self.file)
self.te_text.grid(row = height[0], column = width[4],
rowspan = height[3], columnspan = (width[3]-(width[3]*Decimal(0.05)).quantize(Decimal('1.'), rounding=ROUND_UP)),
sticky = N+E+S+W
)
file_selector()
text_editor()
事先對糟糕的代碼表示抱歉,Tkinter的文檔記錄不是很好(我也不是很擅長)。
您無需進行所有這些計算-tkinter非常適合您計算幾何。
您在使用網格時犯了兩個非常常見的錯誤。 當容器中有多余的空間(例如:框架)時,網格將為“權重”為正的行和列分配額外的空間。 默認情況下,網格行和列的權重為0(零),這意味着它們不會獲得任何額外的空間。
根據經驗,內部小部件使用網格的每一幀都必須至少具有正權重的一行和一列。 您可以使用grid_rowconfigure
和grid_columnconfigure
命令來執行此操作。 在您的情況下,您需要給至少一行(可能是最下面一行)賦予1(一)的權重。
您也有另一個非常普遍的問題。 考慮下面這行代碼和其他類似的代碼:
topleft = Frame(...).grid(...)
上面將始終將topleft
設置為None
因為這是grid
返回的內容。 因此,您認為進入topleft
任何小部件實際上都將進入根窗口,因為將None
指定為父級或母版與提供根窗口相同。
但是,我認為您還有更大的問題。 對具有多個小部件的整個應用程序使用一個網格非常困難。 相反,您需要采取“分而治之”的方法。
例如,您的GUI顯然有兩個主要區域:左側和右側。 因此,我將從制作兩個框架開始,每側一個框架。 這樣,右邊的任何grid或pack命令都不會影響左邊的grid或pack命令,反之亦然。
似乎左側也被分為兩個部分:帶有彩色框架的頂部和底部是列表框和滾動條的底部。 我建議將左側分成兩半。 同樣,左下角的網格或包裝的使用不會影響左上角的網格或包裝的使用。 這將大大簡化您的布局問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.