繁体   English   中英

Python Tkinter:使用Entry创建一个列表,并将列表更新发送到另一个类

[英]Python Tkinter: create a list with Entry, and send the list updated to another class

我的目标是使用Tkinter制作一个GUI程序,该程序使用一个按钮创建一个窗口,打开另一个窗口,其中有两个标记,表示用户必须写入的某些点的坐标x和y。 必须将此坐标插入列表中(例如:[[0,1],[2,3],...)。 然后,我只想在画布中绘制这些点,使用函数create_oval。 这是我的代码

 from Tkinter import * import tkMessageBox, tkFileDialog class nodes(Frame): def __init__(self, master=None): Frame.__init__(self, master, relief=SUNKEN, bd=2) self.root_nodes = Tk() self.root_nodes.geometry("200x150") self.lista=[] Label(self.root_nodes, text="x: ").pack() self.x = Entry(self.root_nodes) self.x.pack() Label(self.root_nodes, text="y: ").pack() self.y = Entry(self.root_nodes) self.y.pack() self.ok = Button(self.root_nodes, text="OK", command=self.OK) Label(self.root_nodes, text="\\n") self.ok.pack() self.fine = Button(self.root_nodes, text="END", command=self.end) self.fine.pack() def OK(self): self.lista.append([float(self.x.get()),float(self.y.get())]) def end(self): return self.lista self.root_nodes.destroy() class AppUI(Frame): def __init__(self, master=None): Frame.__init__(self, master, relief=SUNKEN, bd=2) def points(): x = nodes() self.a = x.end() print self.a #here self.frame = Frame(root) self.point = Button(self.frame, text = "Points", command = points).pack() self.frame.pack(side =LEFT, fill =BOTH) self.canvas = Canvas(self, bg="white", width=400, height=400,bd=0, highlightthickness=0) #for i in range (0, len(self.a)): #self.canvas.create_oval(self.a[i][0] - 1 , self.a[i][1] - 1, self.a[i][0] + 1 , self.a[i][1] + 1) self.canvas.pack() try: self.master.config(menu=self.barra_menu) except AttributeError: # master is a toplevel window (Python 1.4/Tkinter 1.63) self.master.tk.call(master, "config", "-menu") root = Tk() root.geometry("400x400") miaApp = AppUI(root) miaApp.pack() root.mainloop() #here 

我有一些疑问:

  1. 首先:这是一种用类创建和初始化窗口的优雅方法吗? 因为我看到很多方法可以做到这一点
  2. 显然,当我在AppUI中打印self.a时,它会打印一个空列表,因为在上一课中我初始化了self.lista = []! 所以我需要更新变量self.lista的东西,这样它就可以到达AppUI的所有点
  3. 为什么我单击root_nodes中的按钮END它没有销毁?
  4. 最后一件事:类必须“沟通”,因为我希望我的变量列表在代码的许多“位置”:当然在AppUI类中,我放画布(第一个#here),但也在主体中代码(第二个#here),因为我必须用它做一些操作

非常感谢

我的目标是使用Tkinter制作一个GUI程序,用一个按钮创建一个窗口

from Tkinter import *

class OneButton():
    def __init__(self, master):
        self.master=master
        Button(master, text="Get Coordinates", command=self.get_coords).grid(row=0)
        Button(master, text="Exit", command=master.quit).grid(row=1)

    def get_coords(self):
        self.N=Nodes(self.master)

这会打开另一个窗口,其中有两个标记,表示用户必须写入的某些点的坐标x和y。

class Nodes():
    def __init__(self, master):
        self.root_nodes = Toplevel(master)
        self.root_nodes.geometry("200x150")

        self.lista=[]        
        Label(self.root_nodes, text="x: ").grid(row=0, column=0)
        self.x = Entry(self.root_nodes)
        self.x.grid(row=0, column=1)
        Label(self.root_nodes, text="y: ").grid(row=1, column=0)
        self.y = Entry(self.root_nodes)
        self.y.grid(row=1, column=1)
        self.ok = Button(self.root_nodes, text="OK", command=self.OK)
##        Label(self.root_nodes, text="\n")
        self.ok.grid(row=5, column=0, columnspan=2)
        self.fine = Button(self.root_nodes, text="Close this window", command=self.end)
        self.fine.grid(row=10, columnspan=2)

    def OK(self):     
        self.lista.append([float(self.x.get()),float(self.y.get())])
        print self.lista

    def end(self):       
        self.root_nodes.destroy()

然后,我只想在画布中绘制这些点,使用函数create_oval

class AppUI():
    def __init__(self, master, lista):
        self.master=master

        self.frame = Toplevel(master)
        self.canvas = Canvas(self.frame, bg="white", width=400, height=400,bd=0,
                              highlightthickness=0)
        self.canvas.grid()
        for x, y in lista:
            print x, y
            self.canvas.create_oval(x, y, x+10, y+10, fill="black")

root = Tk()
root.geometry("400x400")

miaApp = OneButton(root)
root.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM