[英]My tkinter window isn't showing everything it should
I wrote this code and it makes the window I'm trying to create just fine:我写了这段代码,它使我试图创建的 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()
Which looks like this: Pop-up window看起来像这样:弹出 window
The problem is that when I try to turn this code into a pop-up window, it doesn't show everything I defined.问题是,当我尝试将此代码转换为弹出窗口 window 时,它并没有显示我定义的所有内容。 This is the main that calls the 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()
And this is the program as the pop-up window:这是作为弹出窗口 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()
I've tried to find an answer to this all over the internet, but I haven't found anything.我试图在整个互联网上找到这个问题的答案,但我没有找到任何东西。 I'm still fairly new to Python and very new to tkinter.
我对 Python 还是很陌生,对 tkinter 还是很陌生。
After being shown how to use self correctly, I figured out what was wrong with the code.在展示了如何正确使用 self 之后,我发现了代码有什么问题。 I'm putting the fixed code here for anyone else who might run into this.
我将固定代码放在这里,以供其他可能遇到此问题的人使用。
Summarized Fix:总结修复:
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)
}
If anyone would like to see the full program, here it is:如果有人想看完整的程序,这里是:
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.