Изменение размера виджета с окном tkinter и cx_Freeze - PullRequest
0 голосов
/ 05 мая 2020

Извините за ошибки, я француз. Я создал окно на Tkinter и использовал cx_Freeze, чтобы сделать его исполняемым. Он работает хорошо, но моя проблема заключается в размере виджетов, которые переключаются между тем, когда он отображается на python как сценарий и отображается как исполняемый файл. Он больше исполняемого файла. Я искал на форуме и нашел совет, который гласит: не форсируйте Tkinter'size, он отлично справляется сам. Но мне нужно выбрать размер на этикетках, что бы ни случилось? Я не понимаю. Два изображения имеют одинаковый размер, так как вы можете видеть разницу: исполняемый файл Python Вот мой код для cx_Freeze:

from cx_Freeze import setup, Executable

setup(
    name="Mon super programme",
    version="0.1",
    description="Affiche le path",
    executables=[Executable("Accueil generateur et correcteur.py")]
)

И мой другой код для окна:

from tkinter import *
fenetre=Tk()
fenetre.geometry("1080x850")
fenetre.config(bg='#4065A4')

###Frame
cadre=Frame(fenetre, width=1080, height=720, borderwidth=0, bg='#4065A4')
frame_bas=Frame(cadre, borderwidth=0, bg='#4065A4')

###Canvas
can1=Canvas(frame_bas, bg='#4065A4', height=50, width=1, bd=0, highlightthickness=0)   #Espace
can2=Canvas(frame_bas, bg='#4065A4', height=25, width=1, bd=0, highlightthickness=0)   #Espace
can3=Canvas(frame_bas, bg='#4065A4', height=1, width=25, bd=0, highlightthickness=0)   #Espace
fond1=Canvas(frame_bas, bg='#4065A4', height=350, width=400, bd=0, highlightthickness=0)
fond2=Canvas(frame_bas, bg='#4065A4', height=350, width=400, bd=0, highlightthickness=0)
fond3=Canvas(frame_bas, bg='#4065A4', height=350, width=400, bd=0, highlightthickness=0)
fond4=Canvas(frame_bas, bg='#4065A4', height=350, width=400, bd=0, highlightthickness=0)

###Formes
fond1.create_rectangle(0, 0, 400, 350, fill="red", width=5,outline="black")
fond2.create_rectangle(0, 0, 400, 350, fill="green", width=5,outline="black")
fond3.create_rectangle(0, 0, 400, 350, fill="blue", width=5,outline="black")
fond4.create_rectangle(0, 0, 400, 350, fill="purple", width=5,outline="black")

###Labels
titre=Label(cadre, text="Générateur et correcteur de QCM", font=('Arial',25), bg='#4065A4')
corriger=Label(frame_bas, text="Corriger une\n épreuve", font=('Arial',25), bg='green')
creer=Label(frame_bas, text="Créer une base\n de questions", font=('Arial',25), bg='red')
generer=Label(frame_bas, text="Générer une\n épreuve \n à partir \nd'une base", font=('Arial',25), bg='blue')
modifier=Label(frame_bas, text="Modifier une\n base de \nquestions", font=('Arial',25), bg='purple')

###Intégration au Frame
titre.grid(row=0, column=0)
can1.grid(row=0, column=0)
can2.grid(row=2, column=0)
can3.grid(row=1, column=1)
corriger.grid(row=1, column=0)
fond2.grid(row=1, column=0)
creer.grid(row=1, column=2)
fond1.grid(row=1, column=2)
generer.grid(row=3, column=0)
fond3.grid(row=3, column=0)
modifier.grid(row=3, column=2)
fond4.grid(row=3, column=2)
frame_bas.grid(row=1, column=0)

###Fonctions action\réaction
def afficher1(event):
    print("créer")
def afficher2(event):
    print(fenetre.geometry())
def afficher3(event):
    print("générer")
def afficher4(event):
    print("modifier")

###Action\Réaction
fond1.bind('<Button-1>', afficher1)
creer.bind('<Button-1>', afficher1)
fond2.bind('<Button-1>', afficher2)
corriger.bind('<Button-1>', afficher2)
fond3.bind('<Button-1>', afficher3)
generer.bind('<Button-1>', afficher3)
fond4.bind('<Button-1>', afficher4)
modifier.bind('<Button-1>', afficher4)



cadre.pack()
fenetre.mainloop()

У вас есть объяснение или решение?

С уважением, спасибо

РЕДАКТИРОВАТЬ: Когда я печатаю геометрию окна на Python, он показывает «1080x650 + 38 + 38», а в исполняемом файле - «1080x650 + 362 +. 19 ". Я не знаю, откуда взялась разница.

РЕДАКТИРОВАТЬ 2: Хорошо, разница между «1080x650 + 38 + 38» и «1080x650 + 362 + 19» зависит от положения окна на экране . Если поместить окно в верхний и левый угол, получится «1080x650 + 0 + 0». Так что в моей проблеме это не интересно ...

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Мой комментарий немного длинный, поэтому я пишу его здесь.

Большинство мониторов имеют DPI, равное 96 пикселей на дюйм, но некоторые из них имеют более крупные мониторы с высоким разрешением. Таким образом, поскольку на дюйм больше пикселей, а виджеты приложений и текст измеряются в пикселях, это означает, что для такого типа мониторов все становится меньше. Чтобы исправить это и адаптировать изображение, сделав его удобным для пользователя размером, Microsoft использует режим осведомленности о DPI. На стороне приложения должно быть установлено значение DPI, чтобы windows знал, как масштабировать изображение / виджеты приложения. С помощью команды

    ctypes.windll.shcore.SetProcessDpiAwareness(2)

мы устанавливаем осведомленность, 2 - коэффициент, означает 200%, 100% - 96 пикселей на дюйм, поэтому 2 - 192 пикселей.

Для более правильного объяснения пожалуйста, проверьте документы. Приветствуются любые исправления / редакции.

0 голосов
/ 06 мая 2020

Код, который работает, добавляет только два предложения в начале:

from tkinter import *
import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(2) # if your windows version >= 8.1
fenetre=Tk()

Похоже, это проблема настольного приложения с высоким разрешением, вот документация: Ссылка на документацию Изменение размера виджетов для нас ничего не изменило.

...