Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python和TKinter,如何重新绘制主屏幕_Python_Tkinter - Fatal编程技术网

使用Python和TKinter,如何重新绘制主屏幕

使用Python和TKinter,如何重新绘制主屏幕,python,tkinter,Python,Tkinter,我有一个程序,其中主窗口分为两个部分,每个部分都有一个表单集合(简单的标签/输入列)。默认情况下,第一节中有4列,第二节中有2列。我希望用户能够更改此比率。我想我已经准备好了所有的程序来做这件事,我只是不能让主窗口用正确的结构重新绘制。任何帮助都将不胜感激。谢谢 我喜欢您的示例背后的简单性和想法,但是,我正在修改一些遗留代码,没有时间将布局重写为定义。我试图创建一个只需执行grid_columnconfig()的def,但没有成功。我减少了代码,使它看起来像我正在使用的一样,而且它也是功能性的。

我有一个程序,其中主窗口分为两个部分,每个部分都有一个表单集合(简单的标签/输入列)。默认情况下,第一节中有4列,第二节中有2列。我希望用户能够更改此比率。我想我已经准备好了所有的程序来做这件事,我只是不能让主窗口用正确的结构重新绘制。任何帮助都将不胜感激。谢谢


我喜欢您的示例背后的简单性和想法,但是,我正在修改一些遗留代码,没有时间将布局重写为定义。我试图创建一个只需执行grid_columnconfig()的def,但没有成功。我减少了代码,使它看起来像我正在使用的一样,而且它也是功能性的。如果您更改变量“max_pol_modules”,它会调整左侧的列,而不是右侧的列,因此,我尝试通过界面小部件更改此变量并重新绘制

from Tkinter import *
import tkFont

max_pol_modules = 3
max_bus_modules = 6 - max_pol_modules

tech_green = '#5E9732'
button_grey = '#666666'
grey = '#777777'

def config1():
    global max_pol_modules, max_bus_modules
    max_pol_modules = 1
    max_bus_modules = 6 - max_pol_modules
#    print max_bus_modules

#    left_frame.update()


def config2():
    global max_pol_modules, max_bus_modules
    max_pol_modules = 2
    max_bus_modules = 6 - max_pol_modules
#    print max_bus_modules


def config3():
    global max_pol_modules, max_bus_modules
    max_pol_modules = 3
    max_bus_modules = 6 - max_pol_modules
#    print max_bus_modules


def config4():
    global max_pol_modules, max_bus_modules
    max_pol_modules = 4
    max_bus_modules = 6 - max_pol_modules
#    print max_bus_modules

def about():
    box.showinfo("About GUI","GE Bus Converter and Point of Load GUI")

def bar(frame, row, span):
    "create a bar to separate a section"
    x = Frame(frame, relief=GROOVE, bd=2, width=86*(span+1), height=2)
    x.grid(row=row, column=0, columnspan=10, pady=7, sticky=S+E)
    x.grid_propagate(0)

def bar2(frame, row, span):
    "create a bar to separate a section"
    x = Frame(frame, relief=GROOVE, bd=2, width=86*(span+1), height=2)
    x.grid(row=row, column=0, columnspan=10, pady=3, sticky=S+E)
    x.grid_propagate(0)

def bar3(frame, row, span):
    "create a bar to separate a section"
    x = Frame(frame, relief=GROOVE, bd=2, width=100, height=2)
    x.grid(row=row, column=0, columnspan=10, pady=7, sticky=S+E)
    x.grid_propagate(0)

root = Tk()

menubar = Menu(root)

submenu=Menu(menubar,tearoff=0)

submenu2=Menu(submenu,tearoff=0)
submenu2.add_command(label="1 - 5", command=config1)
submenu2.add_command(label="2 - 4", command=config2)
submenu2.add_command(label="3 - 3", command=config3)
submenu2.add_command(label="4 - 2", command=config4)

submenu_help = Menu(submenu,tearoff=0)
submenu_help.add_command(label="About",command=about)


submenu.add_cascade(label="Change Configuration",menu=submenu2)

submenu.add_command(label="Exit", command=root.quit)

menubar.add_cascade(label="Settings",menu=submenu)
menubar.add_cascade(label="Help", menu=submenu_help)

# display the menu
root.config(menu=menubar)

entry_wid = 6
small_font = tkFont.Font(family='Arial', size=8, weight='bold')
lite_font = tkFont.Font(family='Arial', size=9)
large_font = tkFont.Font(family='Arial', size=9)
heading_font = tkFont.Font(family='Arial', size=10, weight='bold')
button_font = tkFont.Font(family='Arial', size=8, weight='bold')
root.option_add('*font', lite_font)
root.option_add('*background', '#C2C2C4')
root.option_add('*Label.font', small_font)
root.option_add('*Entry.background', 'white')
root.option_add('*Button.font', button_font)
root.option_add('*Button.background', button_grey)
root.option_add('*Button.foreground', 'yellow')
root.option_add('*Text.background', 'white')
root.option_add('*Text.font', small_font)
root.option_add('*ScrolledText.font', lite_font) 

left_frame = Frame(root)
right_frame = Frame(root)

pol_frame = Frame(left_frame, bd=2, relief=SUNKEN)
x = Label(pol_frame, text="POL Address", anchor=E)
x.grid(row=0, column=0, sticky=E)

x = Label(pol_frame, text="Rtrim (Kohms)", anchor=E)
x.grid(row=1, column=0, sticky=E)

x = Label(pol_frame, text="Nominal Vout (V)", anchor=E)
x.grid(row=2, column=0, sticky=E)

bar2(pol_frame, 0, max_pol_modules)

module_address = []
module_i2c = []
module_status = []
module_resistor = []
module_vout_nominal = []
for i in range(max_pol_modules):
    # Module ID and address
    f = Frame(pol_frame)
    x = Label(f, text=i+1)
    x.grid(row=0, column=0)
    v = StringVar()
    x = Entry(f, textvariable=v, width=3, justify=CENTER)
    x.grid(row=0, column=1)
    f.grid(row=0, column=i+1, pady=8, padx=20)
    module_address.append(v)
    module_i2c.append("")
    module_status.append(0)
    # module resistor
    v = StringVar()
    x = Entry(pol_frame, textvariable=v, width=entry_wid, justify=CENTER)
    f = lambda event, module=i: change_resistor_event(event, module)
    g = lambda value, m=i, o=16: set_change(value, m, o)
    x.bind("<KeyRelease>", f, "+")
    x.bind("<KeyRelease>", g, "+")
    x.bind("<FocusOut>", f, "+")
    x.grid(row=1, column=i+1, pady=0)
    module_resistor.append(v)
    # module nominal vout
    v = StringVar()
    x = Label(pol_frame, textvariable=v, width=entry_wid-1,
          relief=SUNKEN, bg='#DDDDDD', font=lite_font)
    x.grid(row=2, column=i+1, pady=0)
    module_vout_nominal.append(v)

bus_frame = Frame(left_frame, bd=2, relief=SUNKEN)
#x = Label(bus_frame, text="Module (address)", anchor=E)
#x.grid(row=0, column=max_pol_modules+1, sticky=E)
x = Label(bus_frame, text="Bus Conv Address", anchor=E)
x.grid(row=0, column=0, sticky=E)
config_bus = []
r = 0

#for i in range(max_pol_modules,max_pol_modules+max_bus_modules):
for i in range(max_bus_modules):
    # Module ID and address
    f = Frame(bus_frame)
    x = Label(f, text=i+5)
    x.grid(row=0, column=0)
    v = StringVar()
    x = Entry(f, textvariable=v, width=3, justify=CENTER)
    x.grid(row=0, column=1)
    f.grid(row=0, column=i+2, pady=8, padx=20)
    module_address.append(v)
    module_i2c.append("")
    module_status.append(0)


bar2(bus_frame, r, max_bus_modules) 
r += 1

# the measured values
measure_info = ["Vout (V)", "Iout (A)", "Vin (V)", "Temp (degC)"]
measures_bus = []
for mi in measure_info:
    x = Label(bus_frame, text=mi, anchor=E)
    x.grid(row=r, column=0, sticky=E)
    m = []
    for j in range(max_bus_modules):
        v = StringVar()
        x = Label(bus_frame, textvariable=v, width=entry_wid-1,
              relief=SUNKEN, bg='#DDDDDD', font=lite_font)
        x.grid(row=r, column=j+2)
        m.append(v)
    measures_bus.append(m)
    r += 1

pol_frame.grid(row=0, column=0, sticky=N+W)

bus_frame.grid(row=0, column=1, sticky=N+W)

left_frame.grid(row=0, column=0, sticky=N)

right_frame.grid(row=0, column=1, sticky=N)

root.mainloop()

您可能已经尝试过了,但是可以在根小部件上调用update()?
首先,您可能还需要再次打包()。

因为您使用的是栅格几何图形管理器,所以您只需要使用
栅格
方法将它们放置在新的行和列中。您可能还需要调用
rowconfigure
和/或
columnconfigure
为新行和新列添加适当的权重

这里有一个人为的例子,展示了一般原理。它可能更有效,但希望它能给你一个大致的想法:

import Tkinter as tk

class App(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.forms = []
        self.toolbar = tk.Frame(self)
        self.toolbar.pack(side="top", fill="x", expand=False)
        button2 = tk.Button(self.toolbar, text="2 columns", command=self.layout2col)
        button3 = tk.Button(self.toolbar, text="3 columns", command=self.layout3col)
        button2.pack(side="left")
        button3.pack(side="left")
        self.forms_frame = tk.Frame(self, borderwidth=2, relief="groove")
        self.forms_frame.pack(side="top", fill="both", expand="True", padx=2, pady=2)
        for i in range(6):
            frame = tk.LabelFrame(self.forms_frame, text="Form %s" % i)
            self.forms.append(frame)
            label = tk.Label(frame, text="Field %s" % i)
            entry = tk.Entry(frame, width=20)
            label.pack(side="left", fill="y")
            entry.pack(side="left", fill="both", expand=True)

        self.layout2col()

    def layout3col(self):
        self.forms[0].grid(column=0, row=0, padx=4, pady=2, sticky="ew")
        self.forms[1].grid(column=0, row=1, padx=4, pady=2, sticky="ew")
        self.forms[2].grid(column=1, row=0, padx=4, pady=2, sticky="ew")
        self.forms[3].grid(column=1, row=1, padx=4, pady=2, sticky="ew")
        self.forms[4].grid(column=2, row=0, padx=4, pady=2, sticky="ew")
        self.forms[5].grid(column=2, row=1, padx=4, pady=2, sticky="ew")
        self.forms_frame.grid_columnconfigure(0, weight=1)
        self.forms_frame.grid_columnconfigure(1, weight=1)
        self.forms_frame.grid_columnconfigure(2, weight=1)

    def layout2col(self):
        self.forms[0].grid(column=0, row=0, padx=4, pady=2, sticky="ew")
        self.forms[1].grid(column=0, row=1, padx=4, pady=2, sticky="ew")
        self.forms[2].grid(column=0, row=2, padx=4, pady=2, sticky="ew")
        self.forms[3].grid(column=1, row=0, padx=4, pady=2, sticky="ew")
        self.forms[4].grid(column=1, row=1, padx=4, pady=2, sticky="ew")
        self.forms[5].grid(column=1, row=2, padx=4, pady=2, sticky="ew")
        self.forms_frame.grid_columnconfigure(0, weight=1)
        self.forms_frame.grid_columnconfigure(1, weight=1)
        self.forms_frame.grid_columnconfigure(2, weight=0)

if __name__ == "__main__":
    app = App()
    app.mainloop()

我尝试了几乎所有的更新,但没有成功。我目前没有使用pack(),因此对此我不熟悉。我将看一看pack(),看看应该如何集成它。谢谢你的提示。请记住,我已经有一年没有使用Python/TKinter了,所以ymmv。好的,做了一些快速的研究。我不知道pack()是一个布局管理器。我目前正在使用网格管理器。我喜欢你的示例背后的简单性和想法,但是,我正在修改一些遗留代码,没有时间将布局重写为定义。我试图创建一个只需执行grid_columnconfig()的def,但没有成功。我已经减少了代码,使它看起来像我正在使用的一样,而且功能也很好。经过一些测试,我发现我可以添加额外的列,但似乎无法删除不再需要的列。我已经修改了您的代码,以演示我遇到的问题。@Stephen:您不能真正删除行,因为行实际上不作为对象存在。但是,您可以做的是重置行或列的任何配置选项,使其不占用空间(假设该行或列中实际上没有任何内容)。您可以使用
grid\u size
获取它认为有多少行和列,然后将所有空行或空列的权重重置为零。如果您有需要删除的表单(而不是移动到不同的行或列),请使用
grid\u forget
。好吧,我阅读了文档并做了更多的实验,目前在那里编写代码的方式似乎不是一种干净的方式来实现我想要的结果。谢谢你在这方面的帮助。@Stephen:请放心,你想做的是可能的——Tkinter中没有阻止你在运行时更改布局的限制。不幸的是,您对问题的描述不足以了解真正的问题是什么。如果要删除某些表单,请使用
grid\u remove
。如果您阅读grid命令的文档,它可能会有所帮助——它具有移动、删除、添加、小部件以及配置或重新配置行和列所需的所有功能。
import Tkinter as tk

class App(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.forms = []
        self.toolbar = tk.Frame(self)
        self.toolbar.pack(side="top", fill="x", expand=False)
        button2 = tk.Button(self.toolbar, text="2 columns", command=self.layout2col)
        button3 = tk.Button(self.toolbar, text="3 columns", command=self.layout3col)
        button2.pack(side="left")
        button3.pack(side="left")
        self.forms_frame = tk.Frame(self, borderwidth=2, relief="groove")
        self.forms_frame.pack(side="top", fill="both", expand="True", padx=2, pady=2)
        for i in range(6):
            frame = tk.LabelFrame(self.forms_frame, text="Form %s" % i)
            self.forms.append(frame)
            label = tk.Label(frame, text="Field %s" % i)
            entry = tk.Entry(frame, width=20)
            label.pack(side="left", fill="y")
            entry.pack(side="left", fill="both", expand=True)

        self.layout2col()

    def layout3col(self):
        self.forms[0].grid(column=0, row=0, padx=4, pady=2, sticky="ew")
        self.forms[1].grid(column=0, row=1, padx=4, pady=2, sticky="ew")
        self.forms[2].grid(column=1, row=0, padx=4, pady=2, sticky="ew")
        self.forms[3].grid(column=1, row=1, padx=4, pady=2, sticky="ew")
        self.forms[4].grid(column=2, row=0, padx=4, pady=2, sticky="ew")
        self.forms[5].grid(column=2, row=1, padx=4, pady=2, sticky="ew")
        self.forms_frame.grid_columnconfigure(0, weight=1)
        self.forms_frame.grid_columnconfigure(1, weight=1)
        self.forms_frame.grid_columnconfigure(2, weight=1)

    def layout2col(self):
        self.forms[0].grid(column=0, row=0, padx=4, pady=2, sticky="ew")
        self.forms[1].grid(column=0, row=1, padx=4, pady=2, sticky="ew")
        self.forms[2].grid(column=0, row=2, padx=4, pady=2, sticky="ew")
        self.forms[3].grid(column=1, row=0, padx=4, pady=2, sticky="ew")
        self.forms[4].grid(column=1, row=1, padx=4, pady=2, sticky="ew")
        self.forms[5].grid(column=1, row=2, padx=4, pady=2, sticky="ew")
        self.forms_frame.grid_columnconfigure(0, weight=1)
        self.forms_frame.grid_columnconfigure(1, weight=1)
        self.forms_frame.grid_columnconfigure(2, weight=0)

if __name__ == "__main__":
    app = App()
    app.mainloop()