Python 如何';拆分';两边各有两个不同物体的tkinter框架

Python 如何';拆分';两边各有两个不同物体的tkinter框架,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,提前感谢您抽出时间。我正在使用tkinter模块编写一个国际象棋程序。我把棋盘界面放在屏幕的左侧,而在右侧,我希望在玩家移动时打印和更新代数符号(例如1.e4 e5 2.Nf3 Nc6) 由于文本正在更新,我尝试创建一个标签小部件和一个StringVar()对象。但它有一些问题:基本上,屏幕没有右侧,每次移动窗口都会剧烈闪烁,然后在窗口右侧中心显示移动代数符号。然后,对于每一个动作,都会发生同样的痉挛,窗口会稍微扩展,最后字符串会从屏幕上消失 理想情况下,每移动两次,就会有一行新的内容,但现在我

提前感谢您抽出时间。我正在使用tkinter模块编写一个国际象棋程序。我把棋盘界面放在屏幕的左侧,而在右侧,我希望在玩家移动时打印和更新代数符号(例如1.e4 e5 2.Nf3 Nc6)

由于文本正在更新,我尝试创建一个标签小部件和一个StringVar()对象。但它有一些问题:基本上,屏幕没有右侧,每次移动窗口都会剧烈闪烁,然后在窗口右侧中心显示移动代数符号。然后,对于每一个动作,都会发生同样的痉挛,窗口会稍微扩展,最后字符串会从屏幕上消失

理想情况下,每移动两次,就会有一行新的内容,但现在我只满足于在文本到达帧的末尾时将其“换行”

我尝试创建一个Canvas小部件并使用create_text()方法来实现它,但它有点笨拙(尽管这似乎是迄今为止最好的方法)


将tkinter作为tk导入
master=tk.tk()
类棋盘(传统框架):
定义初始化(自):
tk.Frame.\uuuu init\uuuuu(自)
self.pack()
self.master.title(‘国际象棋’)
self.mainframe=tk.Frame(主机,宽度=1600,高度=800)
self.mainframe.pack(side='top',anchor='n')
self.move_data={'x':0,'y':0,'piece':None,'to':None,'from':None,'last':None,'color':'w','enem_color':'b'}
自绘制板(主)
自动计数器=2
self.en_passant=[]
self.pgn_frame=tk.Canvas(self.mainframe,宽度=500,高度=640,bd=5,浮雕=ridge,光标=trek)
self.pgn_frame.pack(side='right')
self.pgn_txt=“”
self.pgn_str=tk.StringVar()
self.pgn_label=tk.label(self.pgn_frame,textvariable=self.pgn_str)
self.pgn_label.pack(fill='both',expand=True)
def牵引板(自、主):
self.board=tk.Canvas(self.mainframe,宽度=680,高度=680,边框宽度=20)
self.board.pack(fill='both',expand=True,side='left')
对于范围(7,-1,-1)内的r:
对于范围(8)内的c:
如果c&1^r&1:
填充='sienna2'
其他:
填充='wheat1'
x0,y0=c*80+24,r*80+24
x1,y1=c*80+104,r*80+104
坐标=(x0,y0,x1,y1)
中心=((x0+x1)/2,(y0+y1)/2)
sq=文件[c]+等级[-r-1]
self.board.create_矩形(坐标,fill=fill,width=0,tags=('square',sq))
棋盘()

我将注意到draw_board()函数在self.mainframe框架内创建一个画布,并将其放置在“左侧”。再次感谢您抽出时间

在搜索了SO的编年史之后,我偶然发现了这个问题的第一位评论者的一条古老智慧:

“tkinter小部件设计用于收缩(或扩展)以完全适合其孩子。”-

这个小小的花絮让我走上了解决问题的正确道路:以前,我试图将标签小部件打包到框架或画布小部件中,其逻辑是孩子应该适应它的父母。但是,多亏了Oakley先生的洞察力,我简化了代码以排除多余的小部件,并简单地设计了标签小部件以满足程序的需要。所以,重新格式化后,看起来

import tkinter as tk

master = tk.Tk()

class Chessboard(tk.Frame):

   def __init__(self):
       tk.Frame.__init__(self)
       self.pack()

       self.master.title('Chess')

       self.mainframe = tk.Frame(master, width = 1600, height = 800)
       self.mainframe.pack(side = 'top', anchor = 'n')


       self.move_data = {'x': 0, 'y': 0, 'piece': None, 'to': None, 'from': None, 'last': None, 'color':'w', 'enem_color':'b'}
       self.draw_board(master)

       self.counter=2
       self.en_passant = []

       self.pgn_txt = ''
       self.pgn_str = tk.StringVar()
       self.pgn_frame = tk.Label(self.mainframe, width = 500, height = 640, bd = 5, relief='ridge', cursor = 'trek', textvariable = self.pgn_str)
       self.pgn_frame.pack(side='right')

   def draw_board(self, master):

       self.board = tk.Canvas(self.mainframe, width = 680, height = 680, borderwidth = 20)
       self.board.pack(fill='both', expand=True, side='left')
       for r in range(7, -1, -1):
           for c in range(8):
               if c&1 ^ r&1:
                   fill = 'sienna2'
               else:
                   fill = 'wheat1'
               x0, y0 = c*80+24, r*80+24 
               x1, y1 = c*80+104, r*80+104
               coords = (x0, y0, x1, y1)
               center = ((x0+x1)/2, (y0+y1)/2)
               self.board.create_rectangle(coords, fill=fill, width = 0, tags = ('square'))

Chessboard().mainloop()


现在还不太好,但很快就会好的。在实际的程序中,文本更新时不会出现上述痉挛,但需要对格式进行一些修改。

请提供一个示例。您发布的代码不足以重现您的问题。我已经更新了代码,使其成为一个可行的示例,尽管包含允许碎片及其移动的整个代码可能有点太长。我希望,至少,棋盘是看得见的,其余的将需要一点想象力!