[英]Python Tkinter: Is there a way prevent 'Label' text from pushing columns to the side?
我對 Python 的 Tkinter 庫工具很陌生。 目前,當用戶向服務器節點輸入正確的登錄憑據時,我正在嘗試在屏幕上輸出文本。 當我圍繞這個 GUI 組織事物時,我使用的是grid
而不是pack
。
有沒有辦法防止Label
文本將列推到一邊?
這是當前 GUI 的樣子:
...當我“登錄”到服務器節點時,屏幕上顯示一些確認文本時會發生以下情況:
......這就是我希望發生的事情(photoshopped):
...並使用@Bryan Oakley 的反饋(細微差別):
我可以移動第二列column=1
上的文本,但文本框輸入模塊右側有一些內容(我不會在這個問題中顯示)。 我最初的想法是,也許 GUI 有一些層優先級,所以也許我可以在底層設置文本,這樣它就不會影響文本框,但我沒有在Tkinter 的官方文檔中找到任何關於如何做到這一點的信息。
這是我的一些代碼:
import json
import requests
import sys
import os
import time
import threading
import getpass
import warnings
from tkinter import *
from tkinter import ttk
nodeIPLabel = Label(text = 'Node IP/Hostname : ')
nodeIPLabel.grid(column = 0, row = 0, sticky='W')
nodeUsernameLabel = Label(text = 'Node username : ')
nodeUsernameLabel.grid(column = 0, row = 1, sticky='W')
nodePasswordLabel = Label(text = 'Node passwword : ')
nodePasswordLabel.grid(column = 0, row = 2, sticky='W')
# Enter Login Credentials
nodeIP = StringVar()
nodeUsername = StringVar()
nodePassword = StringVar()
nodeIPEntry = Entry(textvariable = nodeIP, width = 30)
nodeIPEntry.grid(column = 1, row = 0, sticky='W')
nodeUsernameEntry = Entry(textvariable = nodeUsername, width = 30)
nodeUsernameEntry.grid(column = 1, row = 1, sticky='W')
nodePasswordEntry = Entry(textvariable = nodePassword, width = 30, show = '*')
nodePasswordEntry.grid(column = 1, row = 2, sticky='W')
def nodeLogin():
global nodeIP
nodeIP = nodeIP.get()
global nodeUsername
nodeUsername = nodeUsername.get()
global nodePassword
nodePassword = nodePassword.get()
global nodeType
nodeType = nodeType.get()
nodeURL = 'https://' + nodeIP
try:
listOfStuff = '%s/redfish/v1/Chassis/1' % nodeURL
response = requests.get(listOfStuff, auth=(nodeUsername, nodePassword), verify=False)
if response.status_code == 200:
print('Connection successful!')
except requests.exceptions.ConnectionError:
connectionStatus = Label(text='Connection failure: Incorrect or nonexisting IP/Hostname. Hit "RESET GUI" to restart.', fg = 'red')
connectionStatus.grid(column = 0, row = 7, sticky='N')
except requests.exceptions.InvalidURL:
connectionStatus = Label(text='Connection failure: Nothing was typed in. Hit "RESET GUI" to restart.', fg = 'red')
connectionStatus.grid(column = 0, row = 7, sticky='N')
except KeyError:
connectionStatus = Label(text='Connection failure: Wrong login credentials. Hit "RESET GUI" to restart.', fg = 'red')
connectionStatus.grid(column = 0, row = 7, sticky='N')
except json.decoder.JSONDecodeError:
connectionStatus = Label(text='Connection failure: Unknown error... Hit "RESET GUI" to restart.', fg = 'red')
connectionStatus.grid(column = 0, row = 7, sticky='N')
def resetGUI():
os.startfile(__file__)
sys.exit()
# Login button
nodeLoginButton = Button(text = 'LOGIN', command = nodeLogin, bg = 'green', width = 20)
nodeLoginButton.grid(column = 0, row = 4, sticky='W')
# Reset script button
resetButton = Button(text = 'RESET GUI', command = resetGUI, bg = 'yellow', width = 20)
resetButton.grid(column = 0, row = 5, sticky = 'W')
# Stop script button
stopButton = Button(text = 'EMERGENCY STOP', command = window.destroy, bg = 'red', width = 20)
stopButton.grid(column = 0, row = 6, sticky = 'W')
window.mainloop()
在這種特定情況下,最簡單的解決方案是讓底部標簽跨越一列以上。
connectionStatus.grid(column = 0, row = 7, sticky='N', columnspan=2)
當然,這假設您只使用 2 列。 如果您使用更多,請調整columnspan
以適合您的整體設計。
但是,如果文本太長而無法放入窗口,即使這樣也不夠。 在這種情況下,您需要為小部件提供固定大小。 當你這樣做時,標簽的內容不會導致標簽改變大小。
通常,我為這樣的小部件所做的是給它一個大小,讓標簽跨越您正在使用的所有列,然后使用sticky
屬性讓小部件“粘”到分配給的空間的兩側它。 這將導致標簽增長以適應空間,但由於您已給出明確的請求大小,因此更改文本不會更改標簽的大小。
話雖如此,更簡單的方法是將您的窗口分為兩部分:頂部將是一個包含所有小部件的框架,而底部將僅包含標簽。 然后您可以使用pack
輕松排列頂部和底部部分,然后您可以使用grid
在框架中布置小部件,但是因為標簽在框架之外它不會影響任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.