[英]My tkinter window isn't showing everything it should
我寫了這段代碼,它使我試圖創建的 window 很好:
import math
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle
radValue = ""
def submit():
rangeWin.destroy()
rangeWin = tk.Tk()
rangeWin.title("Range Calculator")
style = ThemedStyle(rangeWin)
style.theme_use("equilux")
bg = style.lookup('TLabel', 'background')
fg = style.lookup('TLabel', 'foreground')
rangeWin.configure(bg=style.lookup('TLabel', 'background'))
upperFrame = ttk.Frame(master=rangeWin)
lowerFrame = ttk.Frame(master=rangeWin)
underFrame = ttk.Frame(master=rangeWin)
frame1_1 = ttk.Frame(master=upperFrame)
frame1_2 = ttk.Frame(master=upperFrame)
frame2_1 = ttk.Frame(master=upperFrame)
frame2_2 = ttk.Frame(master=upperFrame)
frame3_1 = ttk.Frame(master=upperFrame)
frame3_2 = ttk.Frame(master=upperFrame)
frameList = [frame1_1, frame1_2, frame2_1, frame2_2, frame3_1, frame3_2]
upperFrame.grid(row=0, column=0, sticky="w")
lowerFrame.grid(row=1, column=0, sticky="w")
underFrame.grid(row=2, column=0, pady=8)
frRow = 0
frCol = 0
for fr in frameList:
fr.grid(row=frRow, column = frCol, padx=5, pady=5, sticky="w")
frCol += 1
if frCol == 2:
frCol = 0
frRow += 1
lblName = ttk.Label(master=frame1_1, text="Name")
entName = ttk.Entry(master=frame1_1, width=10)
lblName.grid(row=0, column=0, sticky="w")
entName.grid(row=0, column=1, sticky="e")
lblHP = ttk.Label(master=frame1_2, text="HP")
entHP = ttk.Entry(master=frame1_2, width=8)
lblHP.grid(row=0, column=0, sticky="w")
entHP.grid(row=0, column=1, sticky="e")
lblCoord = ttk.Label(master=frame2_1, text="Coordinate")
entXCoord = ttk.Entry(master=frame2_1, width=2)
lblX = ttk.Label(master=frame2_1, text="X")
entYCoord = ttk.Entry(master=frame2_1, width=2)
lblY = ttk.Label(master=frame2_1, text="Y")
entZCoord = ttk.Entry(master=frame2_1, width=2)
lblZ = ttk.Label(master=frame2_1, text="Z")
lblCoord.grid(row=0, column=0, sticky="w")
entXCoord.grid(row=0, column=1, sticky="e")
lblX.grid(row=0, column=2, sticky="e")
entYCoord.grid(row=0, column=3, sticky="e")
lblY.grid(row=0, column=4, sticky="e")
entZCoord.grid(row=0, column=5, sticky="e")
lblZ.grid(row=0, column=6, sticky="e")
lblHeight = ttk.Label(master=frame2_2, text="Height (Blocks)")
entHeight = ttk.Entry(master=frame2_2, width=8)
lblHeight.grid(row=0, column=0, sticky="w")
entHeight.grid(row=0, column=1, sticky="e")
frameSizeLeft = ttk.Frame(master=frame3_1)
frameSizeRight = ttk.Frame(master=frame3_1)
lblSize = ttk.Label(master=frame3_1, text="Size Class")
rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= radValue, value="Tiny")
rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= radValue, value="Small")
rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= radValue, value="Medium")
rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= radValue, value="Large")
rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= radValue, value="Huge")
rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= radValue, value="Gargantuan")
lblSize.grid(row=0, column=0)
frameSizeLeft.grid(row=1, column=0)
frameSizeRight.grid(row=1, column=1)
rbnTiny.grid(row=0, column=0, sticky="w")
rbnSmall.grid(row=0, column=0, sticky="w")
rbnMedium.grid(row=1, column=0, sticky="w")
rbnLarge.grid(row=1, column=0, sticky="w")
rbnHuge.grid(row=2, column=0, sticky="w")
rbnGargantuan.grid(row=2, column=0, sticky="w")
lblNotes = ttk.Label(master=lowerFrame, text="Notes")
txtNotes = tk.Text(master=lowerFrame)
lblNotes.grid(row=0, column=0)
txtNotes.grid(row=1, column=0, sticky="w")
btnSubmit = ttk.Button(master=underFrame, command=submit, text="Submit")
btnSubmit.grid(row=0, column=0)
rangeWin.mainloop()
看起來像這樣:彈出 window
問題是,當我嘗試將此代碼轉換為彈出窗口 window 時,它並沒有顯示我定義的所有內容。 這是調用 window 的主要部分:
from rangeCalculator import RangeCalculator
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle
window = tk.Tk()
window.title("BattleTracker")
#window.geometry("200x200")
style = ThemedStyle(window)
style.theme_use("equilux")
bg = style.lookup('TLabel', 'background')
fg = style.lookup('TLabel', 'foreground')
window.configure(bg=style.lookup('TLabel', 'background'))
newChar = RangeCalculator(window)
lblGreeting = ttk.Label(master=window, text="Welcome to the BattleTracker")
lblGreeting.grid(row=0, column=0)
btnOpen = ttk.Button(master=window, text="Input Stats")
btnOpen.bind("<Button>", lambda e: newChar.generateWindow())
btnOpen.grid(row=1, column=0)
window.mainloop()
這是作為彈出窗口 window 的程序:
import math
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle
class RangeCalculator:
def __init__(self, win = None):
self.win = win
radValue = ""
stats = {}
def generateWindow(self):
rangeWin = tk.Toplevel(master=self.win)
rangeWin.title("Range Calculator")
style = ThemedStyle(rangeWin)
style.theme_use("equilux")
bg = style.lookup('TLabel', 'background')
fg = style.lookup('TLabel', 'foreground')
rangeWin.configure(bg=style.lookup('TLabel', 'background'))
upperFrame = ttk.Frame(master=rangeWin)
lowerFrame = ttk.Frame(master=rangeWin)
underFrame = ttk.Frame(master=rangeWin)
frame1_1 = ttk.Frame(master=upperFrame)
frame1_2 = ttk.Frame(master=upperFrame)
frame2_1 = ttk.Frame(master=upperFrame)
frame2_2 = ttk.Frame(master=upperFrame)
frame3_1 = ttk.Frame(master=upperFrame)
frame3_2 = ttk.Frame(master=upperFrame)
frameList = [frame1_1, frame1_2, frame2_1, frame2_2, frame3_1, frame3_2]
upperFrame.grid(row=0, column=0, sticky="w")
lowerFrame.grid(row=1, column=0, sticky="w")
underFrame.grid(row=2, column=0, pady=8)
frRow = 0
frCol = 0
for fr in frameList:
fr.grid(row=frRow, column = frCol, padx=5, pady=5, sticky="w")
frCol += 1
if frCol == 2:
frCol = 0
frRow += 1
lblName = ttk.Label(master=frame1_1, text="Name")
entName = ttk.Entry(master=frame1_1, width=10)
lblName.grid(row=0, column=0, sticky="w")
entName.grid(row=0, column=1, sticky="e")
lblHP = ttk.Label(master=frame1_2, text="HP")
entHP = ttk.Entry(master=frame1_2, width=8)
lblHP.grid(row=0, column=0, sticky="w")
entHP.grid(row=0, column=1, sticky="e")
lblCoord = ttk.Label(master=frame2_1, text="Coordinate")
entXCoord = ttk.Entry(master=frame2_1, width=2)
lblX = ttk.Label(master=frame2_1, text="X")
entYCoord = ttk.Entry(master=frame2_1, width=2)
lblY = ttk.Label(master=frame2_1, text="Y")
entZCoord = ttk.Entry(master=frame2_1, width=2)
lblZ = ttk.Label(master=frame2_1, text="Z")
lblCoord.grid(row=0, column=0, sticky="w")
entXCoord.grid(row=0, column=1, sticky="e")
lblX.grid(row=0, column=2, sticky="e")
entYCoord.grid(row=0, column=3, sticky="e")
lblY.grid(row=0, column=4, sticky="e")
entZCoord.grid(row=0, column=5, sticky="e")
lblZ.grid(row=0, column=6, sticky="e")
lblHeight = ttk.Label(master=frame2_2, text="Height (Blocks)")
entHeight = ttk.Entry(master=frame2_2, width=8)
lblHeight.grid(row=0, column=0, sticky="w")
entHeight.grid(row=0, column=1, sticky="e")
frameSizeLeft = ttk.Frame(master=frame3_1)
frameSizeRight = ttk.Frame(master=frame3_1)
lblSize = ttk.Label(master=frame3_1, text="Size Class")
rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= radValue, value="Tiny")
rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= radValue, value="Small")
rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= radValue, value="Medium")
rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= radValue, value="Large")
rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= radValue, value="Huge")
rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= radValue, value="Gargantuan")
lblSize.grid(row=0, column=0)
frameSizeLeft.grid(row=1, column=0)
frameSizeRight.grid(row=1, column=1)
rbnTiny.grid(row=0, column=0, sticky="w")
rbnSmall.grid(row=0, column=0, sticky="w")
rbnMedium.grid(row=1, column=0, sticky="w")
rbnLarge.grid(row=1, column=0, sticky="w")
rbnHuge.grid(row=2, column=0, sticky="w")
rbnGargantuan.grid(row=2, column=0, sticky="w")
lblNotes = ttk.Label(master=lowerFrame, text="Notes")
txtNotes = tk.Text(master=lowerFrame)
lblNotes.grid(row=0, column=0)
txtNotes.grid(row=1, column=0, sticky="w")
btnSubmit = ttk.Button(master=underFrame, command=submit, text="Submit")
btnSubmit.grid(row=0, column=0)
def collectStats():
stats = {
"name": entName.get(),
"hP": entHP.get(),
"coordinate": [entXCoord.get(), entYCoord.get(), entZCoord.get()],
"height": entHeight.get(),
"size": radValue,
"notes": txtNotes.get(1.0, tk.END)
}
def submit():
rangeWin.destroy()
我試圖在整個互聯網上找到這個問題的答案,但我沒有找到任何東西。 我對 Python 還是很陌生,對 tkinter 還是很陌生。
在展示了如何正確使用 self 之后,我發現了代碼有什么問題。 我將固定代碼放在這里,以供其他可能遇到此問題的人使用。
總結修復:
class RangeCalculator:
...
def generateWindow(self):
...
# The radValue needed self prepended to it.
rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= self.radValue, value="Tiny")
rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= self.radValue, value="Small")
rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= self.radValue, value="Medium")
rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= self.radValue, value="Large")
rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= self.radValue, value="Huge")
rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= self.radValue, value="Gargantuan")
...
# This also needed self to be implemented.
def collectStats(self):
stats = {
"name": self.entName.get(),
"hP": self.entHP.get(),
"coordinate": [self.entXCoord.get(), self.entYCoord.get(), self.entZCoord.get()],
"height": self.entHeight.get(),
"size": self.radValue,
"notes": self.txtNotes.get(1.0, tk.END)
}
如果有人想看完整的程序,這里是:
import math
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle
class RangeCalculator:
def __init__(self, win = None):
self.win = win
self.radValue = ""
self.stats = {}
def generateWindow(self):
rangeWin = tk.Toplevel(master=self.win)
rangeWin.title("Range Calculator")
style = ThemedStyle(rangeWin)
style.theme_use("equilux")
bg = style.lookup('TLabel', 'background')
fg = style.lookup('TLabel', 'foreground')
rangeWin.configure(bg=style.lookup('TLabel', 'background'))
upperFrame = ttk.Frame(master=rangeWin)
lowerFrame = ttk.Frame(master=rangeWin)
underFrame = ttk.Frame(master=rangeWin)
frame1_1 = ttk.Frame(master=upperFrame)
frame1_2 = ttk.Frame(master=upperFrame)
frame2_1 = ttk.Frame(master=upperFrame)
frame2_2 = ttk.Frame(master=upperFrame)
frame3_1 = ttk.Frame(master=upperFrame)
frame3_2 = ttk.Frame(master=upperFrame)
frameList = [frame1_1, frame1_2, frame2_1, frame2_2, frame3_1, frame3_2]
upperFrame.grid(row=0, column=0, sticky="w")
lowerFrame.grid(row=1, column=0, sticky="w")
underFrame.grid(row=2, column=0, pady=8)
frRow = 0
frCol = 0
for fr in frameList:
fr.grid(row=frRow, column = frCol, padx=5, pady=5, sticky="w")
frCol += 1
if frCol == 2:
frCol = 0
frRow += 1
lblName = ttk.Label(master=frame1_1, text="Name")
entName = ttk.Entry(master=frame1_1, width=10)
lblName.grid(row=0, column=0, sticky="w")
entName.grid(row=0, column=1, sticky="e")
lblHP = ttk.Label(master=frame1_2, text="HP")
entHP = ttk.Entry(master=frame1_2, width=8)
lblHP.grid(row=0, column=0, sticky="w")
entHP.grid(row=0, column=1, sticky="e")
lblCoord = ttk.Label(master=frame2_1, text="Coordinate")
entXCoord = ttk.Entry(master=frame2_1, width=2)
lblX = ttk.Label(master=frame2_1, text="X")
entYCoord = ttk.Entry(master=frame2_1, width=2)
lblY = ttk.Label(master=frame2_1, text="Y")
entZCoord = ttk.Entry(master=frame2_1, width=2)
lblZ = ttk.Label(master=frame2_1, text="Z")
lblCoord.grid(row=0, column=0, sticky="w")
entXCoord.grid(row=0, column=1, sticky="e")
lblX.grid(row=0, column=2, sticky="e")
entYCoord.grid(row=0, column=3, sticky="e")
lblY.grid(row=0, column=4, sticky="e")
entZCoord.grid(row=0, column=5, sticky="e")
lblZ.grid(row=0, column=6, sticky="e")
lblHeight = ttk.Label(master=frame2_2, text="Height (Blocks)")
entHeight = ttk.Entry(master=frame2_2, width=8)
lblHeight.grid(row=0, column=0, sticky="w")
entHeight.grid(row=0, column=1, sticky="e")
frameSizeLeft = ttk.Frame(master=frame3_1)
frameSizeRight = ttk.Frame(master=frame3_1)
lblSize = ttk.Label(master=frame3_1, text="Size Class")
# This is what was causing the window to only show up to this point
# The radValue needed self prepended to it
rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= self.radValue, value="Tiny")
rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= self.radValue, value="Small")
rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= self.radValue, value="Medium")
rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= self.radValue, value="Large")
rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= self.radValue, value="Huge")
rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= self.radValue, value="Gargantuan")
lblSize.grid(row=0, column=0)
frameSizeLeft.grid(row=1, column=0)
frameSizeRight.grid(row=1, column=1)
rbnTiny.grid(row=0, column=0, sticky="w")
rbnSmall.grid(row=0, column=0, sticky="w")
rbnMedium.grid(row=1, column=0, sticky="w")
rbnLarge.grid(row=1, column=0, sticky="w")
rbnHuge.grid(row=2, column=0, sticky="w")
rbnGargantuan.grid(row=2, column=0, sticky="w")
lblNotes = ttk.Label(master=lowerFrame, text="Notes")
txtNotes = tk.Text(master=lowerFrame)
lblNotes.grid(row=0, column=0)
txtNotes.grid(row=1, column=0, sticky="w")
btnSubmit = ttk.Button(master=underFrame, command=self.submit, text="Submit")
btnSubmit.grid(row=0, column=0)
# Passed in self
def collectStats(self):
stats = {
"name": self.entName.get(),
"hP": self.entHP.get(),
"coordinate": [self.entXCoord.get(), self.entYCoord.get(), self.entZCoord.get()],
"height": self.entHeight.get(),
"size": self.radValue,
"notes": self.txtNotes.get(1.0, tk.END)
}
def submit():
rangeWin.destroy()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.