【问题标题】:Parsing object attribute value to widget textvariable将对象属性值解析为小部件文本变量
【发布时间】:2017-10-19 19:50:41
【问题描述】:

我正在 python3 tkinter 中开发一个基本的六边形瓷砖游戏(只是为了好玩和学习)。但是,我找不到将属性值 (self.att_coord) 从对象 (Hexagon) 解析为名为 textvariable 的 tkinter 小部件 (Label) 选项的方法。这个想法是在底部小部件中显示这些值,类似于显示任何棋盘游戏的坐标。

到目前为止,我可以在 IDLE 中 print() 那些值。下面的代码显示了目前为止(只是复制/过去/运行)。

感谢您的帮助。

import tkinter
import math
import random

class Hexagon:
    """
    This class return the Geometric calculations to draw the hexagons
    """
    def __init__(self, center_x, center_y, fit, size):
        self.att_center_x = math.sqrt(3)*(fit+center_x*size)
        self.att_center_y = (center_y*size)*(6/4)
        self.att_size = size
        self.att_coord = (center_x, center_y) #<--- Here the attribute values to parsing
        self.att_polygone = self.met_polygon()
    def __getitem__(self, x):
        return getattr(self, x)
    def met_polygon(self):
        result = []
        for i in range(0, 6):
            angle_deg = 60*i+30
            angle_rad = math.pi/180*angle_deg
            result.append((self.att_center_x+self.att_size*math.cos(angle_rad),
                          self.att_center_y+self.att_size*math.sin(angle_rad)))
        return result

class EofCanvas(tkinter.Canvas):
    def __init__(self, master, *args, **kwargs):
        tkinter.Canvas.__init__(self, master=master, *args, **kwargs)
        self.att_current_coord = ""
    def met_make_hexagon(self, hex_size):
        hexa = Hexagon(1, 1, 0, hex_size)
        x = self.create_polygon(hexa.att_polygone) #<--- Here hexagons are created
        self.tag_bind(x, '<Enter>', lambda x, hexa = hexa:self.met_print_hexcoord(hexa))
    def met_print_hexcoord(self, hexa=None):
        self.att_current_coord = hexa.att_coord
        print(self.att_current_coord) #<--- This print the attribute values to the IDLE
        return hexa.att_coord

class UserInfoGame(tkinter.Frame):
    def __init__(self, master, coord, *args, **kwargs):
        tkinter.Frame.__init__(self, master=master, *args, **kwargs)
        self.current = self.met_get_current_coord(coord)
        self.att_coord_label = self.met_make_coord_label(coord)
    def met_make_coord_label(self, coord):
        label = tkinter.Label(self, width=10, textvariable=self.current) #<--- Here the textvariable
        label.pack()
    def met_get_current_coord(self, coord):
        return coord.att_current_coord

class GameGUI:
    def __init__(self):
        self.root = tkinter.Tk()
        self.root.attributes('-fullscreen', True)
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()

        canvas_game = EofCanvas(self.root, width=int(0.8*screen_width), height=(0.9*screen_height))
        canvas_game.met_make_hexagon(40)

        user_info_game = UserInfoGame(self.root, width=int(0.8*screen_width), height=int(0.1*screen_height), bd=1, relief='ridge', coord=canvas_game)

        canvas_game.grid(column=1, row=1)
        user_info_game.grid(column=1, rows=2)

    def start(self):
        self.root.mainloop()

if __name__ == '__main__':
    appstart = GameGUI()
    appstart.start()

【问题讨论】:

标签: python-3.x class tkinter


【解决方案1】:

通常我们会在 common master 中创建一个变量,然后将其传递给小部件。但是,您将根作为单独的属性传递。您应该更改它,以便您的主类是tkinter.Tk 的子类:

这是一个小例子:

 import tkinter

class EofCanvas(tkinter.Canvas):
    def __init__(self, master, *args, **kwargs):
        tkinter.Canvas.__init__(self, master=master, *args, **kwargs)

        self.bind("<ButtonPress-1>", self.on_click)

    def on_click(self, event):
        self.master.status.set("CLICKED: {0.x}, {0.y}".format(event))

class UserInfoGame(tkinter.Frame):
    def __init__(self, master, coord, *args, **kwargs):
        tkinter.Frame.__init__(self, master=master, *args, **kwargs)

        label = tkinter.Label(self, width=50, textvariable=self.master.status) #<--- Here the textvariable
        label.pack()

class GameGUI(tkinter.Tk):
    def __init__(self, map_size, *args, **kwargs):
        tkinter.Tk.__init__(self, *args, **kwargs)

        self.status = tkinter.StringVar() # we make the variable in a place where all widgets can reach it

        canvas_game = EofCanvas(self, width=200, height=200, bg='white') # We pass "self", which includes all the instance variables
        user_info_game = UserInfoGame(self, bd=1, relief='ridge', coord=canvas_game)

        canvas_game.grid(column=1, row=1)
        user_info_game.grid(column=1, row=2)

if __name__ == '__main__':
    appstart = GameGUI(30) #the int spcifies the size of the board (int x int)
    appstart.mainloop()

如果您将来制作这样的小示例,我们将不胜感激,而不是要求我们挑选您的大量代码。

还有其他方法,但我认为这是最干净的。

【讨论】:

  • 是的!谢谢!
【解决方案2】:

您使用 set() 方法添加/更改文本变量http://effbot.org/tkinterbook/label.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2016-12-07
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多