以下是我典型的python tkinter程序的整体结构.
def funA():
def funA1():
def funA12():
# stuff
def funA2():
# stuff
def funB():
def funB1():
# stuff
def funB2():
# stuff
def funC():
def funC1():
# stuff
def funC2():
# stuff
root = tk.Tk()
button1 = tk.Button(root, command=funA)
button1.pack()
button2 = tk.Button(root, command=funB)
button2.pack()
button3 = tk.Button(root, command=funC)
button3.pack()
Run Code Online (Sandbox Code Playgroud)
funA funB当用户点击按钮1,2,3时,funC将显示Toplevel带有小部件的另一个窗口.
我想知道这是否是编写python tkinter程序的正确方法?当然,即使我这样写,它也会起作用,但这是最好的方法吗?这听起来很愚蠢但是当我看到其他人编写的代码时,他们的代码并没有被大量的函数弄乱,而且大多数都有类.
我们应该遵循哪些具体结构作为良好做法?在开始编写python程序之前我应该如何计划?
我知道编程中没有最佳实践,我也不是要求它.我只是想要一些建议和解释,让我保持正确的方向,因为我自己学习Python.
这是一个较长的应用程序的缩写示例,其中我有多个小部件页面收集用户输入的信息.MyApp将每个页面实例化为一个类.在该示例中,PageTwo希望打印StringVar的值,该值存储来自PageOne中的Entry小部件的数据.我怎么做?我尝试过的每一次尝试都以一个或另一个例外结束.
from tkinter import *
from tkinter import ttk
class MyApp(Tk):
def __init__(self):
Tk.__init__(self)
container = ttk.Frame(self)
container.pack(side="top", fill="both", expand = True)
self.frames = {}
for F in (PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky = NSEW)
self.show_frame(PageOne)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class PageOne(ttk.Frame):
def __init__(self, parent, controller):
ttk.Frame.__init__(self, parent)
ttk.Label(self, text='PageOne').grid(padx=(20,20), pady=(20,20))
self.make_widget(controller)
def make_widget(self, controller):
self.some_input = StringVar
self.some_entry = ttk.Entry(self, textvariable=self.some_input, width=8)
self.some_entry.grid()
button1 = ttk.Button(self, text='Next Page',
command=lambda: …Run Code Online (Sandbox Code Playgroud) 我一直在搜索很多,但我仍然不知道如何从python中的不同类中访问变量.在这种情况下,我想self.v从PageOne类到PageTwo类访问变量.
这是我的代码.
import tkinter as tk
import smtplib
TITLE_FONT = ("Helvetica", 18, "bold")
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, c):
frame = self.frames[c]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="PyMail",foreground = "Red", font=("Courier", 30, "bold"))
label.pack(side="top")
sublabel …Run Code Online (Sandbox Code Playgroud) 我试图教我自己如何使用tkinter,我通过youtube发现了一个有用的代码,我并不完全理解.如果有人能帮助我理解它,我将不胜感激.标记我不理解的事情**
import tkinter as tk # why not from tkinter import? **
class SampleApp(tk.Tk): tk.TK**
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# the container is where we'll stack a bunch of frames
# on top of each other, then the one we want visible
# will be raised above the others
container = tk.Frame(self) *
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo):
page_name = F.__name__
frame = F(container, self) ** …Run Code Online (Sandbox Code Playgroud) 我正在使用 Tkinter 的“grid()”方法为我的 python 程序设计 GUI。
有没有办法让小部件随主窗口缩放?
这是一个简短的例子:
from Tkinter import *
master = Tk()
Label(master, text="This is a test").grid(row=0, column=0)
mytext1 = Text(master, width=30, height=5)
mytext1.grid(row=1, column=0)
mytext2 = Text(master, width=30, height=5)
mytext2.grid(row=3, column=0)
master.mainloop()
Run Code Online (Sandbox Code Playgroud)
我想做的是当主窗口的大小发生变化时,让小部件调整它们的大小。(对于如此小的 GUI,这没有问题,但是当有很多小部件时,这就变得可取了。)
任何帮助将不胜感激!
我想了解以下代码的含义:
class PageOne(tk.Frame):
def __init__(self, parent, controller):
Run Code Online (Sandbox Code Playgroud)
什么是self,parent和controller?这些工具的作用和范围是什么?
我相信在Java中self类似this,但有什么用?parent和controller?
稍后在代码流程中我可以看到:
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
Run Code Online (Sandbox Code Playgroud)
有一个已定义的函数被调用show_frame,但为什么控制器被用来调用这个函数?
所以我正在制作一个程序,要求用户输入一个值.我想通过消息小部件(或标签小部件)显示值,并在输入新输入时更新.
def Enter():
s = v.get()
print (v.get())
e.delete(0, END)
e.insert(0, "")
#Code, Code, Code
...
# Area To Enter Text
v = StringVar()
e = Entry(root, textvariable=v)
e.pack()
m = Message(root, text = "Your Input")
m.pack()
# Enter Button
b = Button(root, text="OK", command=Enter)
b.pack()
Run Code Online (Sandbox Code Playgroud)
有没有办法让v的变量替换Message Widget的文本?
注意:
如果我替换text为textvariable,则在按下每个字符键后更新文本,我需要在用户按下按钮时更新文本.
我的完整代码:
from tkinter import *
import os
# All Functions Below
def callback():
print ("HI")
def Exit():
os._exit(0)
def Enter():
s = e.get()
print (e.get())
m.configure(text=s) …Run Code Online (Sandbox Code Playgroud) 我是 Python 的新手,甚至是 tkinter 的新手。
我使用了来自 stackoverflow 的代码(在 tkinter 中的两帧之间切换)来生成一个程序,根据用户选择的选项,在其中调用新帧并将其放置在彼此的顶部。我的代码的精简版本如下。还有很多帧。
import tkinter as tk
from tkinter import font as tkfont
import pandas as pd
class My_GUI(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, Page_2):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name):
'''Show a frame for …Run Code Online (Sandbox Code Playgroud) 我目前正在为python tkinter中的孩子们创建一个数学测验.在这个测验中,我有3个不同的"页面".测验结束时的起始页面,测验页面和分数页面.在我的开始页面中,我有三个不同的测验难度,用户可以选择.一旦点击"EASY"或"HARD"按钮,我如何从起始页面(例如我的标签和按钮)基本上清除窗口的元素,这样我就可以开始测验了?
我已经被困了几天,试图弄清楚如何使用这种方法动态调整 TKInter 中的框架大小。
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# the container is where we'll stack a bunch of frames
# on top of each other, then the one we want visible
# will be raised above the others
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo):
page_name = F.__name__
frame = F(container, self)
self.frames[page_name] = frame
# put all of the pages in the same …Run Code Online (Sandbox Code Playgroud)