如何在 tkinter window 中显示变量?
How to display the variable in a tkinter window?
我是 Python 的新手,我正在编写以下代码,这是我在其他 stackflow 用户的大力帮助下编写的。
在 运行 脚本之后,一个 tkinter window 打开你可以 select 一个 gcode 文件(它是一个包含 3D 打印机指令的许多行的文件)和更高版本找到此文件中的特定值。
我想实现的是:
1) 在带有 description/label.
的 tkinter window 中的加载 GCODE 按钮下显示此值
2) 对这个值进行一些计算并在 tkinter 中显示它们 window。
3) 最后制作这个脚本的可执行文件,这样每个人都可以使用它,即使没有安装 Python。
我不确定这是超级简单还是需要大量工作,因为我是 Python 的新手(总体编程方面不太好)。我希望我已经解释得足够好,并提前感谢您的任何意见!
用于代码测试的Gcode文件:GCODE FILE
最后的代码:
from tkinter import *
import re
from tkinter import messagebox
from tkinter import filedialog
# Here, we are creating our class, Window, and inheriting from the Frame
# class. Frame is a class from the tkinter module. (see Lib/tkinter/__init__)
class Window(Frame):
# Define settings upon initialization. Here you can specify
def __init__(self, master=None):
# parameters that you want to send through the Frame class.
Frame.__init__(self, master)
#reference to the master widget, which is the tk window
self.master = master
#with that, we want to then run init_window, which doesn't yet exist
self.init_window()
# Load the gcode file in and extract the filament value
def get_filament_value(self, fileName):
with open(fileName, 'r') as f_gcode:
data = f_gcode.read()
re_value = re.search('filament used = .*? \(([0-9.]+)', data)
if re_value:
value = float(re_value.group(1))
return('Volume of the print is {} cm3'.format(value))
else:
value = 0.0
return('Filament volume was not found in {}'.format(fileName))
return value
def read_gcode(self):
root.fileName = filedialog.askopenfilename(filetypes = (("GCODE files", "*.gcode"), ("All files", "*.*")))
self.value.set = self.get_filament_value(root.fileName)
# self.value.set('Button pressed')
def client_exit(self):
exit()
def about_popup(self):
messagebox.showinfo("About", "Small software created by Bartosz Domagalski to find used filament parameters from Sli3er generated GCODE")
#Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Filament Data")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a menu instance
menu = Menu(self.master)
self.master.config(menu=menu)
# create the file object)
file = Menu(menu)
help = Menu(menu)
# adds a command to the menu option, calling it exit, and the
# command it runs on event is client_exit
file.add_command(label="Exit", command=self.client_exit)
help.add_command(label="About", command=self.about_popup)
#added "file" to our menu
menu.add_cascade(label="File", menu=file)
menu.add_cascade(label="Help", menu=help)
#Creating the labels
self.value = StringVar()
l_instruction = Label(self, justify=CENTER, compound=TOP, text="Load GCODE file to find volume, \n weight and price of used filament.")
l = Label(self, justify=CENTER, compound=BOTTOM, textvariable=self.value)
# l.place(x=85, y=45)
l_instruction.pack()
l.pack()
#Creating the button
gcodeButton = Button(self, text="Load GCODE", command=self.read_gcode)
gcodeButton.pack()
# gcodeButton.place(x=140, y=10)
#status Bar
status = Label(self, text="Waiting for file...", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)
# root window created. Here, that would be the only window, but you can later have windows within windows.
root = Tk()
root.resizable(width=False,height=False);
root.geometry("220x300")
#creation of an instance
app = Window(root)
#mainloop
root.mainloop()
您应该将 Label(s)
放在与按钮相同的 Frame
中。当我复制你的代码时,我还必须导入 filedalog
模块 (from tkinter import filedalog
),星号导入似乎没有覆盖它。
您可以使用 StringVar()
变量(来自 tkinter)并将其分配给标签。您可以从该变量中获取 .set()
和 .get()
值。创建变量并将其分配给 Label:
self.value = StringVar('', value=" Load GCODE file to find volume, \n weight and price of used filament.")
l = Label(self, textvariable=self.value)
改变变量值:
self.value.set(self.get_filament_value(root.fileName))
您必须根据需要放置的标签,就像您使用 quitButton.place
对按钮所做的那样。还有其他方法可以处理布局、网格和包。但据我所知,建议为所有元素选择一种布局样式。
创建可执行文件,"freezing" 您的代码,是一个更广泛的主题。选择 look here 一些您可以深入研究的选项。
编辑:
更新了工作代码。更改小部件的位置你会明白 ;) 没有查看代码中的任何新元素。
from tkinter import *
import re
from tkinter import messagebox, filedialog
# Here, we are creating our class, Window, and inheriting from the Frame
# class. Frame is a class from the tkinter module. (see Lib/tkinter/__init__)
class Window(Frame):
# Define settings upon initialization. Here you can specify
def __init__(self, master=None):
# parameters that you want to send through the Frame class.
Frame.__init__(self, master)
# reference to the master widget, which is the tk window
self.master = master
# with that, we want to then run init_window, which doesn't yet exist
self.init_window()
# Load the gcode file in and extract the filament value
def get_filament_value(self, fileName):
with open(fileName, 'r') as f_gcode:
data = f_gcode.read()
re_value = re.search('filament used = .*? \(([0-9.]+)', data)
if re_value:
value = float(re_value.group(1))
return 'Volume of the print is {} cm3'.format(value)
else:
return 'Filament volume was not found in {}'.format(fileName)
def read_gcode(self):
root.fileName = filedialog.askopenfilename(filetypes=(("GCODE files", "*.gcode"), ("All files", "*.*")))
self.value.set(self.get_filament_value(root.fileName))
def client_exit(self):
exit()
def about_popup(self):
messagebox.showinfo("About",
"Small software created by Bartosz Domagalski to find used filament parameters from Sli3er generated GCODE")
# Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Filament Data")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a menu instance
menu = Menu(self.master)
self.master.config(menu=menu)
# create the file object)
file = Menu(menu)
help = Menu(menu)
# adds a command to the menu option, calling it exit, and the
# command it runs on event is client_exit
file.add_command(label="Exit", command=self.client_exit)
help.add_command(label="About", command=self.about_popup)
# added "file" to our menu
menu.add_cascade(label="File", menu=file)
menu.add_cascade(label="Help", menu=help)
# Creating the labels
self.value = StringVar()
l_instruction = Label(self, justify=CENTER, compound=TOP,
text=" Load GCODE file to find volume, \n weight and price of used filament.")
l = Label(self, justify=CENTER, compound=BOTTOM, textvariable=self.value)
# l.place(x=85, y=45)
l_instruction.pack()
l.pack()
l_instruction.pack()
self.value = StringVar()
l = Label(self, textvariable=self.value)
l.pack()
# Creating the button
gcodeButton = Button(self, text="Load GCODE", command=self.read_gcode)
gcodeButton.pack()
# gcodeButton.place(x=140, y=10)
# status Bar
status = Label(self, text="Waiting for file...", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)
# root window created. Here, that would be the only window, but you can later have windows within windows.
root = Tk()
root.resizable(width=False, height=False);
# root.geometry("400x300")
# creation of an instance
app = Window(root)
# mainloop
root.mainloop()
我是 Python 的新手,我正在编写以下代码,这是我在其他 stackflow 用户的大力帮助下编写的。
在 运行 脚本之后,一个 tkinter window 打开你可以 select 一个 gcode 文件(它是一个包含 3D 打印机指令的许多行的文件)和更高版本找到此文件中的特定值。
我想实现的是:
1) 在带有 description/label.
的 tkinter window 中的加载 GCODE 按钮下显示此值2) 对这个值进行一些计算并在 tkinter 中显示它们 window。
3) 最后制作这个脚本的可执行文件,这样每个人都可以使用它,即使没有安装 Python。
我不确定这是超级简单还是需要大量工作,因为我是 Python 的新手(总体编程方面不太好)。我希望我已经解释得足够好,并提前感谢您的任何意见!
用于代码测试的Gcode文件:GCODE FILE
最后的代码:
from tkinter import *
import re
from tkinter import messagebox
from tkinter import filedialog
# Here, we are creating our class, Window, and inheriting from the Frame
# class. Frame is a class from the tkinter module. (see Lib/tkinter/__init__)
class Window(Frame):
# Define settings upon initialization. Here you can specify
def __init__(self, master=None):
# parameters that you want to send through the Frame class.
Frame.__init__(self, master)
#reference to the master widget, which is the tk window
self.master = master
#with that, we want to then run init_window, which doesn't yet exist
self.init_window()
# Load the gcode file in and extract the filament value
def get_filament_value(self, fileName):
with open(fileName, 'r') as f_gcode:
data = f_gcode.read()
re_value = re.search('filament used = .*? \(([0-9.]+)', data)
if re_value:
value = float(re_value.group(1))
return('Volume of the print is {} cm3'.format(value))
else:
value = 0.0
return('Filament volume was not found in {}'.format(fileName))
return value
def read_gcode(self):
root.fileName = filedialog.askopenfilename(filetypes = (("GCODE files", "*.gcode"), ("All files", "*.*")))
self.value.set = self.get_filament_value(root.fileName)
# self.value.set('Button pressed')
def client_exit(self):
exit()
def about_popup(self):
messagebox.showinfo("About", "Small software created by Bartosz Domagalski to find used filament parameters from Sli3er generated GCODE")
#Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Filament Data")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a menu instance
menu = Menu(self.master)
self.master.config(menu=menu)
# create the file object)
file = Menu(menu)
help = Menu(menu)
# adds a command to the menu option, calling it exit, and the
# command it runs on event is client_exit
file.add_command(label="Exit", command=self.client_exit)
help.add_command(label="About", command=self.about_popup)
#added "file" to our menu
menu.add_cascade(label="File", menu=file)
menu.add_cascade(label="Help", menu=help)
#Creating the labels
self.value = StringVar()
l_instruction = Label(self, justify=CENTER, compound=TOP, text="Load GCODE file to find volume, \n weight and price of used filament.")
l = Label(self, justify=CENTER, compound=BOTTOM, textvariable=self.value)
# l.place(x=85, y=45)
l_instruction.pack()
l.pack()
#Creating the button
gcodeButton = Button(self, text="Load GCODE", command=self.read_gcode)
gcodeButton.pack()
# gcodeButton.place(x=140, y=10)
#status Bar
status = Label(self, text="Waiting for file...", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)
# root window created. Here, that would be the only window, but you can later have windows within windows.
root = Tk()
root.resizable(width=False,height=False);
root.geometry("220x300")
#creation of an instance
app = Window(root)
#mainloop
root.mainloop()
您应该将 Label(s)
放在与按钮相同的 Frame
中。当我复制你的代码时,我还必须导入 filedalog
模块 (from tkinter import filedalog
),星号导入似乎没有覆盖它。
您可以使用 StringVar()
变量(来自 tkinter)并将其分配给标签。您可以从该变量中获取 .set()
和 .get()
值。创建变量并将其分配给 Label:
self.value = StringVar('', value=" Load GCODE file to find volume, \n weight and price of used filament.")
l = Label(self, textvariable=self.value)
改变变量值:
self.value.set(self.get_filament_value(root.fileName))
您必须根据需要放置的标签,就像您使用 quitButton.place
对按钮所做的那样。还有其他方法可以处理布局、网格和包。但据我所知,建议为所有元素选择一种布局样式。
创建可执行文件,"freezing" 您的代码,是一个更广泛的主题。选择 look here 一些您可以深入研究的选项。
编辑:
更新了工作代码。更改小部件的位置你会明白 ;) 没有查看代码中的任何新元素。
from tkinter import *
import re
from tkinter import messagebox, filedialog
# Here, we are creating our class, Window, and inheriting from the Frame
# class. Frame is a class from the tkinter module. (see Lib/tkinter/__init__)
class Window(Frame):
# Define settings upon initialization. Here you can specify
def __init__(self, master=None):
# parameters that you want to send through the Frame class.
Frame.__init__(self, master)
# reference to the master widget, which is the tk window
self.master = master
# with that, we want to then run init_window, which doesn't yet exist
self.init_window()
# Load the gcode file in and extract the filament value
def get_filament_value(self, fileName):
with open(fileName, 'r') as f_gcode:
data = f_gcode.read()
re_value = re.search('filament used = .*? \(([0-9.]+)', data)
if re_value:
value = float(re_value.group(1))
return 'Volume of the print is {} cm3'.format(value)
else:
return 'Filament volume was not found in {}'.format(fileName)
def read_gcode(self):
root.fileName = filedialog.askopenfilename(filetypes=(("GCODE files", "*.gcode"), ("All files", "*.*")))
self.value.set(self.get_filament_value(root.fileName))
def client_exit(self):
exit()
def about_popup(self):
messagebox.showinfo("About",
"Small software created by Bartosz Domagalski to find used filament parameters from Sli3er generated GCODE")
# Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Filament Data")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a menu instance
menu = Menu(self.master)
self.master.config(menu=menu)
# create the file object)
file = Menu(menu)
help = Menu(menu)
# adds a command to the menu option, calling it exit, and the
# command it runs on event is client_exit
file.add_command(label="Exit", command=self.client_exit)
help.add_command(label="About", command=self.about_popup)
# added "file" to our menu
menu.add_cascade(label="File", menu=file)
menu.add_cascade(label="Help", menu=help)
# Creating the labels
self.value = StringVar()
l_instruction = Label(self, justify=CENTER, compound=TOP,
text=" Load GCODE file to find volume, \n weight and price of used filament.")
l = Label(self, justify=CENTER, compound=BOTTOM, textvariable=self.value)
# l.place(x=85, y=45)
l_instruction.pack()
l.pack()
l_instruction.pack()
self.value = StringVar()
l = Label(self, textvariable=self.value)
l.pack()
# Creating the button
gcodeButton = Button(self, text="Load GCODE", command=self.read_gcode)
gcodeButton.pack()
# gcodeButton.place(x=140, y=10)
# status Bar
status = Label(self, text="Waiting for file...", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)
# root window created. Here, that would be the only window, but you can later have windows within windows.
root = Tk()
root.resizable(width=False, height=False);
# root.geometry("400x300")
# creation of an instance
app = Window(root)
# mainloop
root.mainloop()