首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组织框架

组织框架
EN

Stack Overflow用户
提问于 2018-08-10 19:47:22
回答 1查看 54关注 0票数 0

我认为关于tkinter有一些基本的东西我不理解,但在阅读了大量的教程和其他答案后,我仍然不明白。我正在尝试组织一个简单的GUI。它应该有一个左手窗格与一个游戏板(游戏是奥赛罗),其中有活动的按钮(我已经忽略了动作功能,因为那样工作正常),然后是右手窗格,有3个窗格,从上到下:一个带有单选按钮在1或2个玩家之间切换,一个与当前得分,一个与游戏评估。现在,后两个只是几行文本。

我想我可以在一个父框架中设置一个网格结构,然后在这个网格中有4个框架,然后在它们里面有小部件。下面是代码(你可以忽略Board类,除非你想运行它:我正在苦苦挣扎的地方是Master)

代码语言:javascript
复制
from tkinter import *
from collections import defaultdict
from PIL import Image as PIL_Image, ImageTk

class Master:
    def __init__(self):
        self.board = Board()
        self.display = Tk()
        self.f = Frame(self.display, width=1050, height=700)
        self.f.grid(row=0, column=0, rowspan=8, columnspan=8)
        self.frame2 = Frame(self.f)
        self.frame2.grid(row=0, column=8, rowspan=4, columnspan=4)
        self.frame3 = Frame(self.f)
        self.frame3.grid(row=4, column=8, rowspan=2, columnspan=4)
        self.frame4 = Frame(self.f)
        self.frame4.grid(row=6, column=8, rowspan=2, columnspan=4)
        self.text1 = Text(self.frame3)
        self.text1.pack()
        self.text2 = Text(self.frame4)
        self.text2.pack()
        self.square = defaultdict(Button)
        self.images = [ImageTk.PhotoImage(PIL_Image.open(f)) for f in ['white.png', 'empty.png', 'black.png']]
        modes = [('{} vs {}'.format(i,j), (i, j)) for i in ['human','computer'] 
        for j in ['human', 'computer']]
            v = StringVar()
            v.set(modes[0][1])
        for text, mode in modes:
            b = Radiobutton(self.frame2, text=text, variable=v, value=mode, command=lambda mode=mode: self.cp_set(mode))
            b.pack(anchor=W)
        self.text1.insert(END, 'score')
        self.text2.insert(END, 'evaluation')
        self.draw_board()
        self.display.mainloop()

    def draw_board(self):
        for i, j in [(x,y) for x in range(8) for y in range(8)]:
            self.square[i,j] = Button(self.f, command=lambda i=i, j=j: self.press(i,j), image=self.images[1 + self.board.square[i,j]])
            self.square[i,j].image = 1 + self.board.square[i,j]
            self.square[i,j].grid(column=i, row=j)

    def cp_set(self, m):
        self.pb, self.pw = m
        return

    def press(self, a, b):
        # make it do something
        return
class Board:
    def __init__(self, parent=None):
        self.parent = parent
        if parent:
            self.square = parent.square.copy()
            self.black_next = not parent.black_next
            self.game_over = parent.game_over
        else:
            self.square = defaultdict(int)
            for square in [(x,y) for x in range(8) for y in range(8)]:
                self.square[square] = 0
            for square in [(3,3), (4,4)]:
                self.square[square] = 1
            for square in [(3,4), (4,3)]:
                self.square[square] = -1
            self.black_next = True
            self.game_over = False

这给出了一幅图片,其中游戏板的顶部4行与单选按钮对齐,但底部4行被分割,两个文本行都位于它们自己的行中,而不是与游戏板的一行相对。

看到这不起作用,我读到了一些关于网格不能保留父框架和子框架之间的列和行的问题,所以我尝试了一种不同的方法,即父框架拆分为两列,然后子框架位于其下面,并有自己的行/列定义。但这也不起作用:

代码语言:javascript
复制
self.board = Board()
self.display = Tk()
self.f = Frame(self.display, width=1050, height=700)
self.f.grid(row=0, column=0, rowspan=1, columnspan=2)
self.frame1 = Frame(self.f, width=700, height=700)
self.frame1.grid(row=0, column=0, rowspan=8, columnspan=8)
self.f2 = Frame(self.f)
self.f2.grid(row=0, column=1, rowspan=2, columnspan=1)
self.frame2 = Frame(self.f2, width=350, height=350)
self.frame2.grid(row=0, column=0)
self.frame3 = Frame(self.f2, width=350, height=350)
self.frame3.grid(row=1, column=0)
self.text1 = Text(self.frame2)
self.text1.pack()
self.text2 = Text(self.frame3)
self.text2.pack()

# in this version, Radiobuttons are children of self.frame2,
# and Buttons in draw_board() are children of self.frame1

我真的很喜欢这个第二个版本,直到我看到结果,董事会完全消失了。如有任何建议,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-10 21:37:02

您可能想要尝试这样的操作:

代码语言:javascript
复制
from tkinter import *
from collections import defaultdict
from PIL import Image as PIL_Image, ImageTk

class Master:
    def __init__(self):
        self.board = Board()
        self.display = Tk()

        self.left = Frame(self.display)
        self.left.grid(row=0, column=0, sticky="new")

        self.right = Frame(self.display)
        self.right.grid(row=0, column=1)

        self.right_top = Frame(self.right)
        self.right_top.grid(row=0, column=0, sticky="nsw")

        self.right_mid = Frame(self.right)
        self.right_mid.grid(row=1, column=0)

        self.right_bottom = Frame(self.right)
        self.right_bottom.grid(row=2, column=0)

        self.text1 = Text(self.right_mid)
        self.text1.pack()
        self.text2 = Text(self.right_bottom)
        self.text2.pack()
        self.square = defaultdict(Button)
        self.images = [ImageTk.PhotoImage(PIL_Image.open(f)) for f in ['white.png', 'empty.png', 'black.png']]
        modes = [('{} vs {}'.format(i,j), (i, j)) for i in ['human','computer'] for j in ['human', 'computer']]
        v = StringVar()
        v.set(modes[0][1])
        for text, mode in modes:
            b = Radiobutton(self.right_top, text=text, variable=v, value=mode, command=lambda mode=mode: self.cp_set(mode))
            b.pack(anchor=W)
        self.text1.insert(END, 'score')
        self.text2.insert(END, 'evaluation')
        self.draw_board()
        self.display.mainloop()

    def draw_board(self):
        for i, j in [(x,y) for x in range(8) for y in range(8)]:
            self.square[i,j] = Button(self.left, command=lambda i=i, j=j: self.press(i,j), image=self.images[1 + self.board.square[i,j]])
            self.square[i,j].image = 1 + self.board.square[i,j]
            self.square[i,j].grid(column=i, row=j)

框架的布局将如下所示:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51785844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档