Python Tkinter可视化显示座位安排

时间:2016-08-17 22:44:33

标签: python tkinter

我正在做一个学校项目,该计划的目的是出售门票,我唯一的问题是"可用和不可用的座位应该以不同方式着色/显示,并在座位出售时更改或返回。",我总共有250个座位,如何在屏幕上显示它们?我应该使用表格还是网格?还是画布?我不想让你为我编码这是我的评估我只需要知道如何有效地解决这个问题。

我曾试图手动使用按钮来显示座位,而不是250个座位的效率。

<sp><sp><sp>value<sp><sp><sp>

我还尝试使用For循环

动态创建按钮
Button(master, text="seat").grid(row=0,column=0) * 250 != efficient

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我刚用不同的场景解决了这个问题。您需要某种方式来跟踪每个座位的变量,以便您可以返回并更改颜色。一种方法是为tkinter小部件创建一个名称,即seat1其中1将更改为座位号。您可能希望布局类似于事件的布局,因此您需要一些行。我是否可以建议在具有特定高度和宽度的画布中放置一个框架。这样,您可以在不改变窗口大小的情况下滚动框架。

以下是一个例子:

import tkinter as tk
from tkinter import ttk


class MainApp(ttk.Frame):

    def __init__(self, parent):
        ttk.Frame.__init__(self, parent)
        self.parent = parent
        self.mainframe = ttk.Frame(self.parent)
        self.canvas = tk.Canvas(self.mainframe)
        self.frame = ttk.Frame(self.canvas)
        self.gen_layout()
        self.column_row_config()

    def column_row_config(self):
        self.parent.rowconfigure(0, weight=1)
        self.parent.columnconfigure(0, weight=1)

    def gen_layout(self):
        self.mainframe.grid(row=0, column=0, sticky='nsew')
        self.canvas.grid(row=0, column=0, sticky='nsew')
        self.frame.grid(row=0, column=0, sticky='nsew')
        self.make_seats()
        self.access_seat_numb(1)

    def make_seats(self):
        # create 250 buttons on 10 rows
        seat_counter = 1
        for x in range(10):
            for y in range(1, 26):
                # print('creating seat %d' % seat_counter)
                b = ttk.Button(
                    self.frame, text='Seat%d' % seat_counter,
                    name='seat%d' % seat_counter
                )
                # doesn't matter that the columns won't line up
                b.grid(row=x, column=y)
                seat_counter += 1

    def access_seat_numb(self, numb):
        # print(self.frame.children)
        for k, v in self.frame.children.items():
            if k == 'seat%d' % numb:
                # run some code on a seat numb
                print(v._name)

if __name__ == '__main__':
    root = tk.Tk()
    MainApp(root)
    root.mainloop()

现在access_seat_numb是一种可以调用并更改该按钮的方法。