Python tkinter标签将从屏幕上消失。不管怎样,我都想检测到这一点

Python tkinter标签将从屏幕上消失。不管怎样,我都想检测到这一点,python,tkinter,grid,label,Python,Tkinter,Grid,Label,我有一些python代码使用循环将tkinter标签放在有问题的画布上。我的问题是,如果循环的数组打印12个标签,有时它们适合屏幕,有时如果标签包含大文本,它们就不适合屏幕 如果屏幕宽度已经用尽,有没有一个聪明的方法打破这个循环 l_row_start_display=6 for l in G_DATA_VIEW_LABELS_ARRAY: ## list of lists of labels l_cnt=0 for lab in l: l_align

我有一些python代码使用循环将tkinter标签放在有问题的画布上。我的问题是,如果循环的数组打印12个标签,有时它们适合屏幕,有时如果标签包含大文本,它们就不适合屏幕

如果屏幕宽度已经用尽,有没有一个聪明的方法打破这个循环

l_row_start_display=6 
for l in G_DATA_VIEW_LABELS_ARRAY: ## list of lists of labels
      l_cnt=0
      for lab in l:
         l_align='W'             
         lab.grid(row=l_row_start_display,
                column=l_cnt,sticky=l_align) 
         l_cnt+=1
      l_row_start_display+=1
或任何其他想法


谢谢

测量字体是关键

import tkinter.font
from tkinter import *

root = Tk()
# Get a font object
font_obj = tkinter.font.Font()
canvas = Canvas(root)
canvas.grid()
string_list = []
string_list.append('the text that is too wide for the canvas and I need to know that it is')
string_list.append('this text will fit')

# Iterate through the strings, getting the number of pixels it takes.
# Note that this can be configured larger or smaller based on need.
can_width = int(canvas['width'])
i = 0
for s in string_list:
    str_pixels = font_obj.measure(s, canvas)
    # Compare the width of the canvas to the number of str_pixels
    if str_pixels <= can_width:
        y = (i + 1) * 20
        canvas.create_text(10,y,anchor='nw',text=s,font='TkDefault')
        i += 1
    else:
        # Print a warning, ignore, whatever when the string is too long.
        print("'" + s + "'", "is too long to display in canvas")

root.mainloop()
import tkinter.font
从tkinter进口*
root=Tk()
#获取字体对象
font\u obj=tkinter.font.font()
画布=画布(根)
canvas.grid()
string_list=[]
string_list.append('对于画布来说太宽的文本,我需要知道它是')
string_list.append('此文本将适合')
#遍历字符串,获取所需的像素数。
#请注意,这可以根据需要配置为更大或更小。
can_width=int(画布['width'])
i=0
对于字符串列表中的s:
str_pixels=font_obj.measure(s,canvas)
#将画布的宽度与str_像素数进行比较
如果str_像素编辑:

我找到了一种方法,可以在仍然使用
.grid()
放置标签的情况下执行此操作。我们可以在man窗口中使用一个框架,然后使用
winfo_width()
winfo_height()
获得框架的大小。使用这些信息并在制作每个标签后获得框架的高度和宽度,我们就可以决定何时结束while语句。这将使我们在放置标签时获得大致的准确性。唯一的问题是它将测量当前帧的大小,而不是小部件的大小,因此您可能需要使用数字来将其移动到您想要的位置

以下是一个例子:

from tkinter import *

root = Tk()
root.geometry("500x300")

l = ["SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT"]
screen = root.winfo_width()
my_frame = Frame(root)
my_frame.pack(expand=True)

last_row = 0
last_column = 0
my_frame_x = my_frame.winfo_width()
my_frame_y = my_frame.winfo_height()
b = True
while b == True:
    for stuff in l:
        if my_frame_x > 450 or my_frame_y > 250:
            print ("Labels cannot be outside of window!")
            b = False
        else:
            lablabel = Label(my_frame) 
            lablabel.config(text = stuff)         
            lablabel.grid(row = last_row, column = last_column)
            last_row += 1
            last_column += 1
            my_frame.update()
            my_frame_x = my_frame.winfo_width()
            my_frame_y = my_frame.winfo_height()

root.mainloop()
您也可以使用
.place()
布局管理器执行此操作。您所需要做的就是定义要在其中创建标签的最大像素x和y

例如,我有一个设置为800x300的窗口,我已将标签生成器配置为在达到像素限制后不再创建任何标签。这是通过定义标签的像素大小,将该大小添加到下一个位置,然后检查以确保新的x和y数字不超过预定义的大小来完成的

看看这个例子:

from tkinter import *

root = Tk()
root.geometry("800x300")
root.minsize(800, 300)


l = ["SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT", "SOME TEXT"]
last_x = 0
last_y = 0
b = True
while b:
    for stuff in l: 
        last_x+=100
        last_y+=30
        if last_x > 700 or last_y > 270:
            b = False
            print ("Labels cannot be outside of window!")

        else:
            lablabel = Label(root) 
            lablabel.config(text = stuff)         
            lablabel.place(x = last_x, y = last_y, width = 100) 

root.mainloop()

此代码给出一个错误<代码>\u tkinter.TclError:错误的窗口路径名“TkDefault”
请提供功能代码。我已更新了答案,其中包含了两个示例,说明如何获得接近您所需的内容。一个使用
.grid()
,另一个使用
.place()
谢谢您的回复。由于标签文本的动态特性,宽度未知。这就是为什么我不能这样做的原因。@Ab贝内特:我已经环顾了很多地方,找不到任何可以“检测”可见窗口外任何东西的东西。我能想到的最接近的方法是测量框架,直到框架变得大于定义的大小。因为框架将扩展,直到它与父窗口的大小匹配为止,您可以这样使用它。但除此之外,我不确定你是否能做你想做的。@Ab贝内特:如果你能找到一个答案,我很想知道:)