2017-06-14 32 views
2

考慮:製作的Toplevel調整自身以適應標題

#!/usr/bin/python 

from Tkinter import * 

root=Tk() 
root.withdraw() 

top=Toplevel() 
top.title("Some long title") 
label = Label(top, text ="short", font=('Times', 18)) 
label.pack() 

root.mainloop() 

產生的Toplevel窗口大剛夠容納的內容。但是,標題不能被看到。如何讓窗口調整大小以顯示內容和標題?

回答

0

你不能做你想做的。 Tkinter無法訪問關於標題欄的信息。

+0

那麼,人們做什麼?我的意思是,沒有自尊的應用程序可以容忍標題被隱藏! – AlwaysLearning

+0

@AlwaysLearning:我認爲你錯了。我可以很容易地從各種程序中刪除標題的窗口。 –

0

經過一些挖掘和測試,我想我找到了一些可以使用的東西。我們需要使用tkFont的導入並使用actual()來獲取字體信息。

嘗試以下操作:

from tkinter import * 
import tkinter.font as tkFont 

# imports for python 2 
# from Tkinter import * 
# import tkFont 

root=Tk() 
root.withdraw() 

top=Toplevel() 

label_not_settings = Label(top, text ="Some long title") 
label_not_settings.grid(row = 0, column = 0, sticky = 'w') 

label_arial_12 = Label(top, text ="Some long title", font = ('Arial', 12)) 
label_arial_12.grid(row = 1, column = 0, sticky = 'w') 

label = Label(top, text ="Some long title", font=('Times', 18)) 
label.grid(row = 2, column = 0, sticky = 'w') 


empty_font = tkFont.Font() 
label_not_settings_font = tkFont.Font(font = label_not_settings['font']) 
label_arial_12_font = tkFont.Font(font = label_arial_12['font']) 
toplevel_font = tkFont.Font(top.title("Some long title")) # no error comes from this line thought I don't think its actually working as intended. 
label_font = tkFont.Font(font = label['font']) 

print('# Results of priting with .actual() "empty_font = tkFont.Font()"') 
print(empty_font.actual()) 
print("") 
print("# Results of priting with .actual() on {}".format("label_not_settings_font")) 
print(label_not_settings_font.actual()) 
print("") 
print("# Results of priting with .actual() on {}".format("label_arial_12_font")) 
print(label_arial_12_font.actual()) 
print("") 
print("# Results of priting with .actual() on {}".format("toplevel_font")) 
print(toplevel_font.actual()) 
print("") 
print("# Results of priting with .actual() on {}".format("label_font")) 
print (label_font.actual()) 

root.mainloop() 

對我來說這導致:

# Results of priting with .actual() "empty_font = tkFont.Font()" 
{'family': 'Arial', 'size': 12, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0} 

# Results of priting with .actual() on label_not_settings_font 
{'family': 'Segoe UI', 'size': 9, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0} 

# Results of priting with .actual() on label_arial_12_font 
{'family': 'Arial', 'size': 12, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0} 

# Results of priting with .actual() on toplevel_font 
{'family': 'Arial', 'size': 12, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0} 

# Results of priting with .actual() on label_font 
{'family': 'Times New Roman', 'size': 18, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0} 

它似乎產生你所需要的字體信息。雖然我不是100%確定它調用toplevel_font.actual()時按預期工作,但它產生了與調用一個空變量(我想它只是說明默認字體,但我不確定)相同的結果。另外,如果我創建一個帶有文本但沒有字體配置的標籤,那麼它會產生不同的font.actual()結果。

更新:

而且我已經調查創建與標題欄的功能你自己的標題欄的問題。到目前爲止,我遇到的問題是窗口移動,因此當拖動窗口時,標題欄的左上角位於鼠標點,將窗口拖到顯示器的一側時會失去自動調整大小的功能,無法手動調整窗口大小。

我想成像它可以建立一個功能齊全的標題欄,我會努力,因爲我很感興趣,看看我能不能做一個。但現在這裏有一些信息來說明創建自己的標題欄的基礎知識。

這段代碼來自於這個帖子:Can I change the title bar in Tkinter?

我已經取得了一些小的變化,但它基本上是相同的。

from tkinter import * 

root = Tk() 

def move_window(event): 
    root.geometry('+{0}+{1}'.format(event.x_root, event.y_root)) 

root.overrideredirect(True) # turns off title bar, geometry 
root.geometry('200x100') # set new geometry 

# make a frame for the title bar 
title_bar = Frame(root, bg = 'white', relief = FLAT, bd = 2) 

# put a close button on the title bar 
close_button = Button(title_bar, text = 'X', relief = FLAT, command = root.destroy) 

# a canvas for the main area of the window 
window = Canvas(root, bg='black') 

# pack the widgets 
title_bar.pack(expand = 1, fill = X) 
close_button.pack(side = RIGHT) 
window.pack(expand = 1, fill = BOTH) 
# bind title bar motion to the move window function 
title_bar.bind('<B1-Motion>', move_window) 

root.mainloop() 

編輯:

這一切都這樣說,我可能只是測試對每個主要的操作系統和除冰一個良好的root.geometry()root.minsize(),將顯示在全標題的文本。這可能不是一個優雅的解決方案,如使用代碼來計算文本大小並將該大小應用於窗口大小,但它應該可以實現。

+0

在第一個示例中,不能保證標籤使用的字體與系統在窗口標題欄中使用的字體相同。此外,這段代碼沒有任何意義:'tkFont.Font(top.title(「Some long title」))''。 'top.title(...)'只返回一個空字符串,導致'tkFont.Font()'返回默認字體。 –

+0

@Bryan Oakley:我在想'top.title(...)',因爲它沒有拋出任何錯誤。這就是爲什麼我寫了'雖然我不是100%肯定它調用toplevel_font.actual()'時按預期工作。此外,我用一些不同的結果更新了我的答案。 –

相關問題